2

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

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

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

是否有一些自定义模型绑定/泛型/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});
4

1 回答 1

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 的根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 的强类型视图,这些类创建的目的仅仅是为了从业务层获取您需要的内容到每个视图。它们消除了 ViewBag 的使用问题,它的工作方式类似于 Session/Cookie/etc,您需要记住通过字符串名称将哪些对象/类型放入其中。由于 ViewModel 看起来就像普通类,因此您可以将所有普通类型的继承应用于它们,以增强您在这个问题中需要的那种可重用性。

例如,如果您的应用程序的给定部分中的每个页面/视图都需要上述过滤的选择列表,您可以让所有这些 ViewModel 从实现过滤的基础继承并具有一个public SelectList DocumentTypeChoices { get; set; }道具,您可以将逻辑放入一次. 只是一个建议!

于 2013-06-17T13:43:06.163 回答