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) =&gt; new HtmlString(…) 在最后一个格式旁边的那个: 。您的代码不能放在HtmlString() 中。这就是我们需要隐藏按钮的地方。您所建议的是我在添加(创建)操作的代码中显示的确切内容。这意味着您的代码只能在 WebGrid 列格式之外工作。顺便说一句,我仍然不习惯 lambda 表达式。

以上是关于WebGrid MVC 5 - 显示基于身份验证和授权的操作按钮的主要内容,如果未能解决你的问题,请参考以下文章

MVC WebGrid 仅对页面上存在的元素进行排序

ASP.NET MVC3 - 仅分页(不显示 WebGrid)

MVC 5、WIF (System.IdentityModel) 和 ADFS 未实际进行身份验证,联合注销时出错

Owin 和 Windows 身份验证 (mvc5) - 使用 Windows 身份验证作为登录的一部分

混合身份验证 - 基于 Spring MVC 会话 + 基于 JWT 令牌

ASP.Net MVC 5 身份验证与另一个 MVC 5 身份网站