通常我们有类似于以下逻辑的东西:
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使用的其他解决方案是什么?
要记住的事情:
string
时并且不会丢失所有这些“属性名称列表”答案 0 :(得分:0)
好吧,我要做的是使用存储库模式。 您可以使用查询数据库的特定方法创建e存储库,并返回该下拉列表的数据。您可以为该特定方法添加参数,因此您可以根据具体情况稍微更改数据。然后在控制器中,您只需初始化存储库并调用该方法,将数据分配给视图模型属性并返回视图。
答案 1 :(得分:0)
最后,我决定结合我在问题文本中指出的方式。
EditorTemplate :用于“静态”列表或基于枚举的
HTML帮助程序:对于可能存在隐私问题的数据库内容,甚至是“我不希望使其成为参数的过滤器”。可能没有缓存此数据(个案情况)
Ajax填充下拉列表:对于数据库内容我不关心用户是否知道过滤器参数(没有安全漏洞),甚至可以毫无顾虑地缓存数据。