MVC3 DropDownListFor-一个简单的例子?


112

DropDownListFor在MVC3应用中遇到问题。我能够使用StackOverflow弄清楚如何使它们出现在视图上,但是现在我不知道如何在提交视图模型时捕获其相应属性中的值。为了使它起作用,我必须创建一个具有ID和value属性的内部类,然后必须使用an IEnumerable<Contrib>来满足DropDownListFor参数要求。但是,现在,MVC FW应该如何将在此下拉列表中选择的值映射回我的视图模型的simple string属性中?

public class MyViewModelClass
{
    public class Contrib
    {
        public int ContribId { get; set; }
        public string Value { get; set; }
    }

    public IEnumerable<Contrib> ContribTypeOptions = 
        new List<Contrib>
        {
            new Contrib {ContribId = 0, Value = "Payroll Deduction"},
            new Contrib {ContribId = 1, Value = "Bill Me"}
        };

    [DisplayName("Contribution Type")]
    public string ContribType { get; set; }
}

在我的视图中,将下拉列表放置在页面上,如下所示:

<div class="editor-label">
    @Html.LabelFor(m => m.ContribType)
</div>
<div class="editor-field">
    @Html.DropDownListFor(m => m.ContribTypeOptions.First().ContribId, 
             new SelectList(Model.ContribTypeOptions, "ContribId", "Value"))
</div>

当我提交表单时,ContribType(当然)为null。

正确的方法是什么?

Answers:


166

您应该这样做:

@Html.DropDownListFor(m => m.ContribType, 
                new SelectList(Model.ContribTypeOptions, 
                               "ContribId", "Value"))

哪里:

m => m.ContribType

是结果值所在的属性。


2
谢谢!!!谢尔盖,这正是我已经寻找了好几个小时了。
Trey Carroll

谢谢:)的回答有没有办法从此处显示“-选择-”。?
kbvishnu 2012年

1
@VeeKeyBee,例如,您可以将新项目添加到列表中contribTypeOptionsnew Contrib {ContribId = -1, Value = "Please Select"}它将显示在下拉列表中。比您可以检查的ContribType是,-1这是否意味着用户尚未选择任何值
Sergey Gavruk,2012年

9
您可以这样做:@Html.DropDownListFor(m => m.ContribType, new SelectList(Model.ContribTypeOptions, "ContribId", "Value", Model.ContribTypeOptions.First().ContribId), "Select, please")
谢尔盖·加夫鲁克

1
@SergeyGavruk。该答案已被用作对最近几个问题的欺骗,但由于该语句而使一些用户感到困惑,并且Select list构造函数的最后一个参数是选定的值 -该方法忽略了最后一个参数(内部构造了自己的参数SelectList) 。它的属性(ContribType)的值决定了选择的内容(即模型绑定的工作方式),并且代码应为@Html.DropDownListFor(m => m.ContribType, new SelectList(Model.ContribTypeOptions, "ContribId", "Value")。您可以编辑答案以更正吗?

7

我认为这会有所帮助:在Controller中获取列表项和选定的值

public ActionResult Edit(int id)
{
    ItemsStore item = itemStoreRepository.FindById(id);
    ViewBag.CategoryId = new SelectList(categoryRepository.Query().Get(), 
                                        "Id", "Name",item.CategoryId);

    // ViewBag to pass values to View and SelectList
    //(get list of items,valuefield,textfield,selectedValue)

    return View(item);
}

并在视野中

@Html.DropDownList("CategoryId",String.Empty)

5
像这样将您的存储库暴露给View通常不是上帝的模式。
安德烈·佩纳

6

要将动态数据绑定到DropDownList中,可以执行以下操作:

如下所示在Controller中创建ViewBag

ViewBag.ContribTypeOptions = yourFunctionValue();

现在在如下所示的视图中使用该值:

@Html.DropDownListFor(m => m.ContribType, 
    new SelectList(@ViewBag.ContribTypeOptions, "ContribId", 
                   "Value", Model.ContribTypeOptions.First().ContribId), 
    "Select, please")

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.