2010-11-20 161 views
10

我想知道在ASP.NET MVC中填充常用下拉列表时,最佳实践是什么。例如,我有我的申请中经常使用的国家和州选择。从我的控制器填充viewmodel并绑定到该视图模型对于我想包含这样一个下拉列表的每个视图来说,看起来很脏。ASP.NET MVC - 填充常用下拉列表

在这种情况下,人们如何填充他们的下拉列表? - 这个烘焙的定制基类?助手课程等?

由于提前,

JP

回答

7

你可以有一个RequiresStateList属性注入的常见功能,需要它的行动。

public class RequiresStateList : ActionFilterAttribute { 
    public override void OnResultExecuting(ResultExecutingContext filterContext) 
    { 
     filterContext.Controller.ViewData["StateList"] = GetStates(); 
    } 
} 

而且你的行动

[RequiresStateList] 
public ActionResult Index() { 
    return View(); 
} 

现在你可以在您的视图从ViewData的该列表。

+0

不知道为什么我没有想到这是一个优雅且可重用的解决方案。谢谢! – 2010-11-20 15:33:26

+0

@JP,不客气:) – 2010-11-21 10:31:28

+1

在开玩笑,我宣称这违反了Thunderdome原则! – Merritt 2011-02-25 16:46:29

3
+0

非常优雅:模型和视图都不会臃肿。视图中的*代码*优雅且可重用。 HtmlHelper可以单独进行单元测试。 – 2011-02-11 12:17:56

+0

我喜欢这个解决方案,让他们在模型中。我更愿意将我的模型保存到正在填充/提交的数据中,在这种情况下,这将是选定的值 - 而不是完整的值列表。这些也可以让您的视图模板获取DispalyFor模板的选定值的Text属性(即获取Value属性与选定值匹配的Text属性)。 – 2011-10-24 18:50:32

+0

使用DAL扩展HTML助手会打破MVC架构,因为您将视图调用到数据层而不是仅仅是一个虚拟。 尽管打破MVC架构并不一定是件坏事。 – Yorro 2013-07-11 12:06:51

0

我创建匹配视图模型的大风扇(模型)每个视图都完全一样所以,如果你有一个国家下拉列表视图,我的视图模型将有一个ListItems的国家集合。

我不担心查看具有州集合的模型。相反,我会集中逻辑得到美国,是这样的:

viewModel.States = StatesHelper.GetStates(); // returns IList<ListItem> 
+0

这里有一个关于这种方法的有趣的说法:http://mikehadlow.blogspot.com/2010/10/populating-drop-down-lists-in-aspnet.html – Merritt 2011-02-25 16:44:34