所以,假设我有 View 的以下部分:
<td>
@Html.ActionLink("Delete")
</td>
我只希望用户拥有特定权限 - DeleteItems
才能使用此功能。执行此操作的几种方法是使用 if
语句包装链接,或者对接受一组权限的 ActionLink
帮助程序进行重载。
如果
版本:
@if (User.HasPermission(Permissions.DeleteItems))
{
<td>
@Html.ActionLink("Delete", "Delete")
</td>
}
重载版本:
<td>
@Html.ActionLink("Delete", "Delete", Permissions.DeleteItems)
</td>
酷 - 我认为这里明显的赢家是过载。
但是,如果我要遮挡的区域更大怎么办?
<div class="deleteWrapper">
<table>
<tr>
<td>Id</td>
<td></td>
</tr>
@foreach (var item in items)
{
<tr>
<td>@item.Id</td>
<td>@Html.ActionLink("Delete", "Delete", new { id = @item.Id })
</tr>
}
</table>
</div>
当然,If
版本仍然有效,但我不想到处都有 @if (User.Has...(...))
在我看来。我喜欢的是 Html.BeginForm
的语法:
@using(Html.BeginForm(...))
{
...
}
但是,BeginForm
only adds to the response - 它实际上并没有对括号之间的 View 片段做任何事情。有没有办法使用助手删除括号内的标记?
@using(Html.ShowIf(...))
{
...
}
最佳答案
是的,可以。以下是仅适用于 Razor
的示例:
@using (this.BeginPermissionScope(Permissions.DeleteItems))
{
using (Html.BeginForm("Delete", "Home"))
{
<input type="submit" value="Submit" />
}
}
C#
代码:
public static class HtmlHelperPermissionScopeExtensions
{
/// <summary>
/// Begin new rendering scope based on current user permissions
/// </summary>
public static IDisposable BeginPermissionScope(this WebViewPage webViewPage, Permissions permission)
{
var currentIdentity = webViewPage.User.Identity;
bool userHasPermission = currentIdentity.HasPermission(permission);
return new PermissionScopeHelper(webViewPage, !userHasPermission);
}
/// <summary>
/// Helper class that replaces current output stream with its own
/// </summary>
private sealed class PermissionScopeHelper : IDisposable
{
WebViewPage webViewPage;
TextWriter oldWriter;
TextWriter newWriter;
/// <summary>
/// Initializes helper class instance. If ignoreMarkupUntilDispose is set to true, then
/// all markup writen to response will be ignored
/// </summary>
public PermissionScopeHelper(WebViewPage page, bool ignoreMarkupUntilDispose)
{
if (ignoreMarkupUntilDispose)
{
webViewPage = page;
newWriter = new StringWriter();
// Replace output TextWriter for Write() and WriteLiteral() methods
webViewPage.OutputStack.Push(newWriter);
// Replace output TextWriter for all HtmlHelper and AjaxHelper extensions
oldWriter = webViewPage.ViewContext.Writer;
webViewPage.ViewContext.Writer = newWriter;
}
}
/// <summary>
/// Restore output TextWriters
/// </summary>
public void Dispose()
{
if (webViewPage != null)
{
webViewPage.ViewContext.Writer = oldWriter;
webViewPage.OutputStack.Pop();
newWriter.Dispose();
}
}
}
}
关于asp.net-mvc-4 - 如何使用辅助方法有条件地输出 View 的一部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19028905/