MVC3 DropDownListFor - 一个简单的例子?

112

在我的MVC3应用程序中,我遇到了使用DropDownListFor的麻烦。我能够使用StackOverflow找出如何在视图上显示它们,但现在我不知道当它被提交时如何捕获相应属性中的值。为了让它工作,我不得不创建一个内部类,其中有一个ID和一个值属性,然后我使用IEnumerable<Contrib>来满足DropDownListFor的参数要求。现在,MVC框架应该如何将此下拉菜单中选择的值映射回我的视图模型上的简单字符串属性?

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。

正确的做法是什么?

4个回答

166
你应该像这样做:
@Html.DropDownListFor(m => m.ContribType, 
                new SelectList(Model.ContribTypeOptions, 
                               "ContribId", "Value"))

其中:

m => m.ContribType

这是一个属性,其结果值将会是什么。


2
谢谢!Sergey,这正是我寻找了许多小时的东西。 - Trey Carroll
谢谢您的回答。有没有办法从这里显示“--请选择--”? - kbvishnu
1
@VeeKeyBee,你可以向列表contribTypeOptions中添加新项目,例如new Contrib {ContribId = -1, Value = "请选择"},它将显示在下拉列表中。然后你可以检查ContribType是否为-1,这意味着用户没有选择任何值。 - Sergey Gavruk
9
您可以使用以下代码:@Html.DropDownListFor(m => m.ContribType, new SelectList(Model.ContribTypeOptions, "ContribId", "Value", Model.ContribTypeOptions.First().ContribId), "请选择") - Sergey Gavruk
1
@SergeyGavruk。这个答案在最近的一些问题中被用作重复,但由于语句“Select列表构造函数的最后一个参数是所选值”,它使一些用户感到困惑-该方法忽略了最后一个参数(它在内部构建自己的SelectList)。它是属性(ContribType)的值决定了选择什么(这就是模型绑定的工作原理),代码应该只是@Html.DropDownListFor(m => m.ContribType, new SelectList(Model.ContribTypeOptions, "ContribId", "Value")。请编辑答案进行更正。 - user3559349
显示剩余2条评论

6
为了在下拉列表中绑定动态数据,您可以按照以下步骤执行:
在控制器中创建像下面这样的 ViewBag:
ViewBag.ContribTypeOptions = yourFunctionValue();

现在可以像下面这样在视图中使用该值:

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

6
我认为这可能会有所帮助: 在控制器中获取列表项和选定值。
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
将代码库暴露给视图通常不是一个好的编程模式。 - Andre Pena

0
     @Html.DropDownListFor(m => m.SelectedValue,Your List,"ID","Values")

这里的Value是你想保存所选值的模型对象


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接