gpt4 book ai didi

asp.net-mvc-4 - 如何使用辅助方法有条件地输出 View 的一部分

转载 作者:行者123 更新时间:2023-12-04 04:40:03 27 4
gpt4 key购买 nike

所以,假设我有一个 View 的以下部分:

<td>
@Html.ActionLink("Delete")
</td>

我只希望拥有特定权限的用户可以使用此功能 - DeleteItems .有几种方法可以用 if 包裹链接。声明或重载 ActionLink接受一组权限的助手。
If版本:
@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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com