我已经实现了一个访问级别系统,可以阻止/允许访问不同的文档类型。
我有几个索引页面可以列出多种类型的文档。可以使用下拉列表过滤这些内容。
我无法想到一种可以自动绑定下拉列表的方法,因此它不会显示当前用户无权访问的文档。
是否有一些自定义模型绑定/泛型/ html辅助魔法会帮助我,或者我是否太完美主义?
我的代码atm:
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});
答案 0 :(得分:1)
您已经得到了答案:只需使用名为“GenerateASelectListFor”的方法将“Magic”设为静态类。然后,在您的视图中,完全跳过ViewBag。您的视图可以与命名空间中的任何公共类进行通信。
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" } });
}
}
}
在你的视图中,它就像以下一样简单:
@Html.DropDownList("Foo", YourNameSpace.Magic.GenerateASelectListFor())
您只需要确保Web.config
文件夹(不是主Web.config )根目录中的Views
命名空间的条目:
<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强类型的Views,ViewModel是专门为了从Business层获取所需内容而创建的类。它们消除了ViewBag的问题用法,ViewBag的工作方式类似于Session / Cookie / etc,您需要记住哪些对象/类型通过字符串名称投入其中。由于ViewModel看起来就像普通类一样,因此您可以将所有正常类型的继承应用于它们,以便为此问题中所需的可重用性提供支持。
例如,如果您应用的给定部分中的每个页面/视图都需要上面过滤的选择列表,那么您可以让所有这些ViewModel继承自实现过滤的基础并具有public SelectList DocumentTypeChoices { get; set; }
道具,其中你会把你的逻辑放在一次。只是一个建议!