C# MVC帮助台应用:管理员角色显示所有工单报错求助
解决C# MVC帮助台视图的工单筛选问题
嘿,我帮你梳理下这个问题,你写的代码里有两个明显的语法和逻辑错误,咱们一步步来修正:
先看你遇到的错误原因
第一个代码片段里的
if(item.RaisedBy == User.IsInRole ="Admin"):User.IsInRole是一个方法,需要带参数调用,也就是User.IsInRole("Admin"),而不是直接写方法名;- 你这里的逻辑也不对,想表达的应该是「如果是管理员,就显示所有工单」,而不是把管理员角色和
RaisedBy做比较。另外=是赋值符号,不是比较符号,这里也用错了。
第二个代码片段里的
if (item.RaisedBy = User.IsInRole("Admin"):- 同样,
=是赋值,不是比较,应该用==; User.IsInRole("Admin")返回的是布尔值(true/false),而item.RaisedBy是字符串类型,两者类型不匹配,所以会报「无法将bool隐式转换为string」的错误。
- 同样,
正确的视图筛选逻辑
你想要的效果是:管理员能查看所有工单,普通用户只能查看自己创建的工单,对应的正确条件应该是「用户是管理员」或者「工单的创建者是当前用户」,代码如下:
@foreach (var item in Model) { // 满足任一条件就渲染该工单 if (User.IsInRole("Admin") || item.RaisedBy == User.Identity.Name) { // 这里放你渲染表格行的代码,比如: <tr> <td>@Html.DisplayFor(modelItem => item.TicketId)</td> <td>@Html.DisplayFor(modelItem => item.RaisedBy)</td> <td>@Html.DisplayFor(modelItem => item.Subject)</td> <!-- 其他工单字段的渲染代码 --> </tr> } }
更优的建议:把筛选逻辑移到Controller
其实更规范的做法是在Controller层就完成数据筛选,而不是在视图里做判断,这样既让视图更简洁,也更安全(避免用户通过修改前端代码看到不属于自己的工单)。示例代码如下:
public ActionResult Index() { using (var db = new YourDbContext()) { // 先获取所有工单 var allTickets = db.Tickets.AsQueryable(); // 如果不是管理员,只筛选当前用户创建的工单 if (!User.IsInRole("Admin")) { allTickets = allTickets.Where(t => t.RaisedBy == User.Identity.Name); } // 将筛选后的列表传给视图 return View(allTickets.ToList()); } }
这样你的视图里就不需要任何判断,直接遍历Model即可:
@foreach (var item in Model) { <tr> <td>@Html.DisplayFor(modelItem => item.TicketId)</td> <td>@Html.DisplayFor(modelItem => item.RaisedBy)</td> <td>@Html.DisplayFor(modelItem => item.Subject)</td> </tr> }
内容的提问来源于stack exchange,提问作者Michael
相关产品推荐
相关产品推荐

