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



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

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

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

是否有一些自定义模型绑定/泛型/html帮助魔法,将帮助我,还是我太完美主义?

My code 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});

您已经得到了答案:只需使用名为"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())

您只需要确保Views文件夹 (而不是主Web.config)的根目录下的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,这些类仅仅是为了从业务层获得你需要的东西而创建的。它们消除了ViewBag的问题用法,它的工作原理与Session/Cookie等类似,在这些地方你需要记住通过字符串名称抛出的对象/类型。由于ViewModels看起来就像普通的类,所以您可以对它们应用所有普通类型的继承,以增强您在这个问题中需要的可重用性。

例如,如果在你的应用程序的给定部分的每个页面/视图需要上述过滤的选择列表,你可以有所有这些ViewModels继承从一个基础,实现过滤和有一个public SelectList DocumentTypeChoices { get; set; }道具,你把你的逻辑在一次。只是个建议!

最新更新