MVC - 集中下拉列表的设计模式

时间:2017-03-02 07:16:19

标签: c# asp.net-mvc design-patterns

通常我们有类似于以下逻辑的东西:

public class DummyController : Controller
{ 
    public ActionResult Index()
    {
       var model = new TestViewModel
        {
            Selected = "2",
            // NOTE: i can use a service to fill it with DB values
            OptionsSelectList = new List<SelectListItem>
            {
                new SelectListItem {Text = "Option 1", Value = "1"},
                new SelectListItem {Text = "Option 2", Value = "2"},
                new SelectListItem {Text = "Option 3", Value = "3"}
            }
        };
        return View(model);
    }
}

查看

@Html.DropDownListFor(e=> e.Selected, Model.OptionsSelectList);

现在我正在尝试将单一责任原则的概念应用于这种情况。

我可能有几个地方需要在很多地方呈现相同的下拉列表,我不想在每个需要使用它的控制器操作中复制/粘贴这段代码。

所以,首先我想到创建一个 EditorTemplate (MVC Views / Shared / EditorTemplates / DummyOptionsSelectList.cshtml),其中接收的模型匹配该属性的数据类型,例如{{1} }或int?或其他。但是现在我认为我需要访问C#服务才能访问数据库(甚至不计算额外的逻辑,因为根据用户权限等过滤数据......)....然后我认为这不是最好的方法。

然后第二种方法是使用自定义 HTML Helper 来完成此操作...因为那时我在一个类中而不在视图上....更容易到达数据库服务层

但是......我仍然看到这种方法存在一些问题......

为我提供所有我正在寻找的其他选项是在客户端使用Javascript填充dropwdown(通过总是需要检索数据)...但这种方法的缺点是“暴露”某种方式我的自己的API,并且每个下拉框强制一个新的http请求,我的页面有......

我想知道你们/ gals使用的其他解决方案是什么?

要记住的事情:

  • 每种下拉类型的集中逻辑
  • 根据用户权限等,返回的数据可能会有所不同(我需要考虑到我需要访问当前用户ID或其他一些必要信息)
  • “isSelected”值仍需要工作
  • html元素的id / name仍然需要匹配所有其他表单输入,类似于我使用string时并且不会丢失所有这些“属性名称列表”

2 个答案:

答案 0 :(得分:0)

好吧,我要做的是使用存储库模式。 您可以使用查询数据库的特定方法创建e存储库,并返回该下拉列表的数据。您可以为该特定方法添加参数,因此您可以根据具体情况稍微更改数据。然后在控制器中,您只需初始化存储库并调用该方法,将数据分配给视图模型属性并返回视图。

答案 1 :(得分:0)

最后,我决定结合我在问题文本中指出的方式。

EditorTemplate :用于“静态”列表或基于枚举的

HTML帮助程序:对于可能存在隐私问题的数据库内容,甚至是“我不希望使其成为参数的过滤器”。可能没有缓存此数据(个案情况)

Ajax填充下拉列表:对于数据库内容我不关心用户是否知道过滤器参数(没有安全漏洞),甚至可以毫无顾虑地缓存数据。