另一种在MVC3.0中填充HTML.Dropdownlistfor中选定值的方法

时间:2011-08-18 14:38:16

标签: jquery asp.net-mvc asp.net-mvc-3

在下面的代码中,尽管model.Title保持正确的选定值,但它没有在ddl中设置,具有id'Title'。

我可以用其他任何方式设置所选值吗? (就像文件准备好了吗?)

    <td> 
@Html.DropDownListFor(model => model.Title, Model.TitleList, !Model.IsTitleEditable ? (object)new { id = "Title", @disabled = "disabled", @style = "width:250px;" } : (object)new { id = "Title", @style = "width:250px" })
</td>

在我的控制器中,选择列表如下所示:

model.TitleList = new SelectList(GetAllTitles(), "Code","Value"); 

在这种情况下,当我使用其他重载方法时,如何设置此selectList的selectedValue属性?

3 个答案:

答案 0 :(得分:3)

如果,您将model.TitleList创建为IEnumerable&lt; SelectListItem&gt;,您可以在其中设置Text的值为SelectListItems 的model.Value是其中一个值SelectListItems 然后一切都应该有效。所以:

model.TitleList = GetAllTitles()
            .ToList()
            .Select(i => new SelectListItem { 
                                Value = i.Id.ToString(),
                                Text = i.Description });

model.Title = 5;

并在您的视图中:

<td> 
@Html.DropDownListFor(model => model.Title, 
                      Model.TitleList, 
                      !Model.IsTitleEditable 
                         ? (object)new { @disabled = "disabled", @style = "width:250px;" } 
                         : (object)new { @style = "width:250px" })
</td>

请注意,HtmlAttributes中不需要id =“Title”,帮助程序会为您创建一个ID。

修改 关于Selected上的SelectListItem属性存在一些混淆。使用DropDownListFor时使用 NOT ,仅在DropDownList中使用。因此,对于DropDownListFor,您可以将模型的属性设置为您想要选择的值(上面提到的model.Title = 5;)。

答案 1 :(得分:1)

如果Model.TitleListSelectList,您可以在模型创建期间填充SelectList时指定所选值。举例说明:

var model = new MyViewModel();
var domainEntity = GetMyDomainEntity(id);

// Create a selectlist using all your titles and specifying the Title value of the item
// you're viewing as the selected item. See parameter options if you're not supplying
// an object as the selected item value
model.TitleList = new SelectList(GetAllTitles(), domainEntity.Title)

然后,您只需在视图中执行Html.DropDownListFor

答案 2 :(得分:1)

Personnaly我喜欢做的是拥有一个静态类,如:

public static class SelectLists 
{
    public static IList<SelectListItem> Titles(int selected = -1) 
    {
        return GetAllTitles()
            .Select(x => new SelectListItem  { 
                    Value = x.Id.ToString(), 
                    Text = x.Description, 
                    Selected = x.Id == selected
                }).ToList();
    }
}

然后在我看来:

@Html.DropDownListFor(x => x.Title, SelectLists.Titles(Model.Title), !Model.IsTitleEditable ? (object)new { id = "Title", @disabled = "disabled", @style = "width:250px;" } : (object)new { id = "Title", @style = "width:250px" });

我所有的SelectLists都在那个班级,如果我有太多的选择列表,我会在不同的班级中分开。

我发现它很有用,因为如果你需要在另一个视图/动作中使用相同的下拉列表,则不必重复控制器中的代码。