gpt4 book ai didi

c# - 在 MVC 中访问 ViewData 的集中函数

转载 作者:行者123 更新时间:2023-11-30 23:24:37 25 4
gpt4 key购买 nike

我想根据用户拥有的权限以不同方式显示一些内容。为了获得当前 session 用户所有权限的列表,我将它们放入 ViewData

现在,我在 MainMenu.cshtml 中创建了一个函数 (HasPrivilege) 来检查特定权限是否在列表中。此信息用于以不同方式显示图 block 。

@functions {
public bool HasPrivilege(Type privilege)
{
string name = privilege.Name;
if (name.EndsWith("Attribute"))
{
name = name.Substring(0, name.Length - "Attribute".Length);
}

return ((ISet<string>)ViewData[ViewDataKeys.Privileges]).Contains(name);
}
}

@helper RenderTile(string targetUrl, string imageUrl, string title, bool isDouble = false, string bgColor = "Gray", bool enabled = true)
{
string linkTitle = enabled ? "" : " title=\"" + Resources.Resources.PromptNotAuthorized + "\"";
string linkCss = enabled ? "" : " disabled";
<a href="@(enabled ? targetUrl : "#")" class="tile @(isDouble ? "double " : "")bg-succest@(bgColor)@(linkCss)"@Html.Raw(linkTitle)>
<div class="tile-content icon">
<img src="@imageUrl">
</div>
<div class="tile-status">
<span class="name">@title</span>
</div>
</a>
}

@RenderTile(Url.Action(null, "User"), "../Images/User.png", Resources.Resources.NavUsers, true, enabled : HasPrivilege(typeof(UserViewReadAttribute)))
@RenderTile(Url.Action(null, "SapXslt"), "../Images/document_gear.png", Resources.Resources.NavXSLTs, enabled : HasPrivilege(typeof(SapXsltViewReadAttribute)))
@RenderTile(Url.Action(null, "Requirements"), "../Images/clipboard_checks.png", Resources.Resources.NavRequirements, enabled : HasPrivilege(typeof(RequirementViewReadAttribute)))

我遇到的问题是:我想在没有代码重复的情况下在每个页面上都有这个功能。由于我很懒,我不想将 ViewData 提交到函数中,它应该可以从上下文中获得。

关于如何做到这一点有什么想法吗?

我发现一些帖子建议将代码放入 App_Code。但是哪个代码?我必须延长类(class)吗?如果有,是哪一个?

最好的问候, 卡斯滕

最佳答案

可以集中@helper通过将它们放入驻留在 App_Code 中的新 cshtml 文件中来发挥作用MVC的目录。然后可以用 <CSHTML FIle Name>.Method 调用它们,例如如果你把你的 @helper RenderTile到名为 RenderHelpers.cshtml 的文件中,您可以调用 RenderHelpers.RenderTile(...)

另一种集中代码的方法是编写扩展方法,例如对于 View 数据:

public static class ViewDataExtensions {

public static bool HasPrivilege(this ViewDataDictionary viewData, Type privilege) {
// ...
}
}

然后像这样使用它if(ViewData.HasPrivilege(typeof(someAttribute)) {/* ... */}

但我建议为图 block 引入一个 ViewModel,它有一个属性 IsAuthorized由 Controller 设置,用于决定它是启用还是禁用。然后,您可以使用此 ViewModel 的 View(或 DisplayTemplate)而不是 @helper 函数来渲染图 block 。

关于c# - 在 MVC 中访问 ViewData 的集中函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37695378/

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