WebGrid MVC 5 - 显示基于身份验证和授权的操作按钮
Posted
技术标签:
【中文标题】WebGrid MVC 5 - 显示基于身份验证和授权的操作按钮【英文标题】:WebGrid MVC 5 – Show action buttons based on Authentication and Authorization 【发布时间】:2015-11-04 09:45:23 【问题描述】:在 WebGrid 的最后一列中有 3 个按钮“创建、编辑、删除”。如标题所示,如果用户经过身份验证和授权,我只想显示“编辑”和“删除”按钮。
如果链接不在 WebGrid 中,例如“添加”按钮,我可以这样做:
<div >
@if (Request.IsAuthenticated && (User.IsInRole("Admin") || User.IsInRole("canEdit")))
<a class="btn btn-success" href="@Url.Action("Create" )" id="btnCreate"><i class='glyphicon glyphicon-plus'></i> </a>
</div>
在网格中,我以这种方式格式化了最后一列:
grid.Column(header: "Action", canSort: false, style: "action col-lg-2",
format: (item) => new htmlString("<a href=" + @Url.Action("Details", new id = item.id ) + " title='Detail' ><i class='glyphicon glyphicon-search'> </i><span class='sr-only'>Detail</span> </a> "
+ " <a href=" + @Url.Action("Edit", new id = item.id ) + "><i class='glyphicon glyphicon-edit'></i><span class='sr-only'>Edit</span> </a> "
+ " <a href=" + @Url.Action("Delete", new id = item.id ) + "><i class='glyphicon glyphicon-trash'> </i> </a> ")
)
而且效果很好。但我无法弄清楚如何将 if 语句放入 lambda 表达式中。我该怎么做?
代码如下:
var grid = new WebGrid(canPage: true, rowsPerPage: Model.PageSize, canSort: true, ajaxUpdateContainerId: "grid");
grid.Bind(Model.Content, rowCount: Model.TotalRecords, autoSortAndPage: false);
@grid.GetHtml(htmlAttributes: new id = "grid" , // id for ajaxUpdateContainerId parameter
fillEmptyRows: false,
tableStyle: "table table-bordered table-hover",
mode: WebGridPagerModes.All,
columns: grid.Columns(
grid.Column("Id", "ID", style: "col-lg-1"),
grid.Column("ProductName", "Name", style: "col-lg-3"),
grid.Column("Description", "Description", style: "col-lg-5"),
grid.Column(header: "Action", canSort: false, style: "action col-lg-2",
format: (item) => new HtmlString("<a href=" + @Url.Action("Details", new id = item.id ) + " title='Detail' ><i class='glyphicon glyphicon-search'> </i><span class='sr-only'>Detail</span> </a> "
+ " <a href=" + @Url.Action("Edit", new id = item.id ) + "><i class='glyphicon glyphicon-edit'></i><span class='sr-only'>Edit</span> </a> "
+ " <a href=" + @Url.Action("Delete", new id = item.id ) + "><i class='glyphicon glyphicon-trash'> </i> </a> ") )
)
);
【问题讨论】:
有人有想法吗? 【参考方案1】:您可以通过以下方式进行授权。
@if ( User.Identity.IsAuthenticated )
if ( User.IsInRole("Admin") )
+ " <a href=" + @Url.Action("Edit", new id = item.id ) + "><i class='glyphicon glyphicon-edit'></i><span class='sr-only'>Edit</span> </a> "
+ " <a href=" + @Url.Action("Delete", new id = item.id ) + "><i class='glyphicon glyphicon-trash'> </i> </a>
记得将[Authorize]
属性添加到您的管理操作方法中:
[Authorize(Roles="Admin")]
public ActionResult Edit()
// ...
return View();
[Authorize(Roles="Admin")]
public ActionResult Delete()
// ...
return View();
【讨论】:
它不起作用。你能在 lambda 表达式中显示完整的代码吗?正如我在问题中所说,您不能将此代码放在 lambda 表达式中。 Lambda 表达式是带有(item) => new HtmlString(…)
在最后一个格式旁边的那个: 。您的代码不能放在HtmlString()
中。这就是我们需要隐藏按钮的地方。您所建议的是我在添加(创建)操作的代码中显示的确切内容。这意味着您的代码只能在 WebGrid 列格式之外工作。顺便说一句,我仍然不习惯 lambda 表达式。以上是关于WebGrid MVC 5 - 显示基于身份验证和授权的操作按钮的主要内容,如果未能解决你的问题,请参考以下文章
ASP.NET MVC3 - 仅分页(不显示 WebGrid)
MVC 5、WIF (System.IdentityModel) 和 ADFS 未实际进行身份验证,联合注销时出错
Owin 和 Windows 身份验证 (mvc5) - 使用 Windows 身份验证作为登录的一部分