2010-03-07 45 views
12

我想了解在ASP.NET MVC 2中使用DropDownListFor帮助程序实现DropDownList的最佳方式。这是一个多部分问题。在ASP.NET MVC 2中实现DropDownList的最佳方式?

首先,将列表数据传递给视图的最佳方式是什么?

  1. 合格名单在你的模型包含数据
  2. 一个SelectList财产转至通过ViewData

我如何在DropDownList空值列表?我是否应该在创建时将其构建到SelectList中,或者是否有其他方法可以告诉帮助程序自动创建空值?

最后,如果由于某种原因存在服务器端错误,我需要重新显示屏幕DropDownList,我是否需要再次获取列表值以传入视图模型?这些数据不会在帖子之间维护(至少在我通过视图模型传递的时候不会),所以我只需要再次获取它(缓存)。我正确地处理这个问题吗?

回答

9

最好的办法是建立在你的控制器中的SelectList - 用我的扩展方法在这里: ViewData["statusid"]=MySelectList

然后只需使用:即到的ViewData使用相同的密钥为您的属性名称 http://blog.wekeroad.com/2010/01/20/my-favorite-helpers-for-aspnet-mvc

流行Html.DropDownFor(x=>x.StatusID),你全都准备好了。

+1

使用ViewData时遇到的问题是它使您的控制器难以测试。如果你把所有东西放在ViewModel中,你的测试会更好。 – Mac 2010-04-30 00:17:07

+2

实际上并没有什么不同 - 使用ViewModel你必须拼出ViewData.Model,否则你只需要用一个键来请求它。没有区别... – 2010-06-02 03:55:09

+0

http://stackoverflow.com/a/5177332/986862 – 2013-12-11 12:21:42

0

(你知道这个了!)

  1. 与包含数据

是,添加它,当你建立了一个的SelectList属性的SelectList传递模型中的列表。 (如果你使用LINQ构建列表,Union可能会派上用场。)

是的,你是。

3

接听零件:

  1. 的最佳方式恕我直言,是通过在ViewModel这样的名单:

    public SelectList Colors 
    { 
        get 
        { 
         // Getting a list of Colors from the database for example... 
         List<Color> colors = GetColors().ToList(); 
    
         // Returning a SelectList to be used on the View side 
         return new SelectList(colors, "Value", "Name"); 
        } 
    } 
    
  2. 要得到这样一个空白或默认选项( - 匹克

    @Html.DropDownListFor(m => m.Color, Model.Colors, "-- Pick a color --") 
    
  3. : - 颜色),您可以在观看侧的做到这一点如果它是ViewModel的一部分,则必须再次获取/填充列表。


看看下面的博客文章。它可以给你一些提示:

Drop-down Lists and ASP.NET MVC

2

你可以这样做:

<%= Html.DropDownListFor((x => x.ListItems), Model.ListItems, "")%> 

<%= Html.DropDownList("ListItems", Model.ListItems, "")%> 

最后PARAM 'optionLabel' 让一个空白列表项

在这种情况下,您可以看到ListItems是模型的一个属性。

我也强制类型化视图模型。

0

我发现使用一系列SelectListItems(而不是SelectList)更直观。

例如,这会从客户对象序列创建IEnumerable<SelectListItem>,您可以将其传递给Html.DropDownListFor(...)助手。 'Selected'属性可以选择在下拉列表中设置默认项目。

var customers = ... // Get Customers 
var items = customers.Select(c => new SelectListItem 
          { 
           Selected = (c.Id == selectedCustomerId), 
           Text = c.Email, 
           Value = c.Id.ToString() 
          }); 
相关问题