gpt4 book ai didi

c# - 根据用户访问级别自动构建SelectList

转载 作者:太空宇宙 更新时间:2023-11-03 13:40:43 24 4
gpt4 key购买 nike

我已经实现了一个访问级别系统来阻止/允许访问不同的文档类型。

我有几个索引页可以列出多种类型的文档。这些可以使用下拉列表进行过滤。

我想不出一种方法可以适本地自动绑定(bind)下拉列表,这样它就不会显示当前用户无权访问的文档。

是否有一些自定义模型绑定(bind)/泛型/html 辅助魔法可以帮助我,还是我太完美了?

我的自动取款机代码:

ViewBag.DocumentTypesList = new SelectList(
new Dictionary<DocumentTypeForUI, string>
{
{ DocumentTypeForUI.Invoice, DocumentType.Invoice.Localize() },
{ DocumentTypeForUI.CreditNote, DocumentType.CreditNote.Localize() },
},
"Key",
"Value",
ViewBag.Type);

我不想在每个索引页上重复的内容:

var dict = new Dictionary<DocumentTypeForUI, string>();

if (CurrentUser.HasAccessTo(DocumentType.Invoice))
{
dict.Add({ DocumentTypeForUI.Invoice, DocumentType.Invoice.Localize() });
}

if (CurrentUser.HasAccessTo(DocumentType.CreditNote))
{
dict.Add({ DocumentTypeForUI.CreditNote, DocumentType.CreditNote.Localize() });
}

ViewBag.DocumentTypesList = new SelectList(
dict,
"Key",
"Value",
ViewBag.Type);

理想:

ViewBag.DocumentTypesList = Magic.GenerateASelectListFor({DocumentType.Invoice, Documentype.CreditNote});

最佳答案

您已经得到了答案:只需使用名为“GenerateASelectListFor”的方法将“Magic”设为静态类即可。然后,在您的 View 中,完全跳过 ViewBag。您的 View 可以与您命名空间中的任何公共(public)类对话。

namespace YourNameSpace
{

public static class Magic
{
public static SelectList GenerateASelectListFor()
{
// your code here obviously....
return new SelectList(new Dictionary<string, string> { { "Foo", "Barr" }, { "Car", "Dog" } });
}
}
}

在您的 View 中,它非常简单:

@Html.DropDownList("Foo", YourNameSpace.Magic.GenerateASelectListFor())

您只需要确保 Web.config 在您的 Views 文件夹的根目录(不是主 Web .config) 有一个用于您的命名空间的条目:

<namespaces>
<add namespace="System.Web.Mvc" />
<add namespace="System.Web.Mvc.Ajax" />
<add namespace="System.Web.Mvc.Html" />
<add namespace="System.Web.Routing" />
<add namespace="YourNameSpace"/>
</namespaces>

附带说明一下,您应该考虑放弃整个 ViewBag/ViewData 范例,以支持针对 ViewModel 强类型化的 View ,ViewModel 是专门为从业务层向每个 View 获取所需内容而创建的类。它们消除了 ViewBag 的有问题的使用,它的工作方式类似于 Session/Cookie/etc,您需要记住通过字符串名称将哪些对象/类型放入其中。由于 ViewModel 看起来就像普通类,您可以将所有普通类型的继承应用于它们,以增强您在这个问题中需要的那种可重用性。

例如,如果您应用的给定部分中的每个页面/ View 都需要上述过滤的选择列表,您可以让所有这些 ViewModel 继承自实现过滤并具有 public SelectList DocumentTypeChoices { get ;放; } prop,你将把你的逻辑放在其中一次。只是一个建议!

关于c# - 根据用户访问级别自动构建SelectList,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17146778/

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