Html.DropDownList和modelbinding

时间:2008-11-20 16:28:56

标签: asp.net-mvc selectlist

为什么不对DropDown进行模型绑定?
我做错了什么?
为了说明我的问题,我做了以下几点:

创建一个新的asp.net MVC项目(beta1) 创建了以下类:

HomeViewData : ViewDataDictionary  
+List : SelectList

向HomeController类添加了一个viewdata,如下所示

Homecontroller: Controller
+HomeViewData vd = new HomeViewData

在Home.Index()方法中添加了以下行:

vd.list = new SelectList(new List<string>(){"test", "test1", "test2"});
return View("Index", vd);

并复制了相同的方法,但使用不同的签名来捕获回发调用

[AcceptVerps(HttpVerbs.Post)]
public ActionResult Index(HomeViewdata d)

这里我在第一行代码中添加了一个断点 然后我将以下代码添加到我的Index.aspx

<%Html.BeginForm();%>
    <%=Html.DropDownList("List")%>
<%Html.EndForm();%>

结果,我得到一个页面,其中包含值test,test1和test2的良好下拉列表 然后选择一个值后按Enter键(没有用提交按钮打扰),看看我的断点如何暂停代码。我检查HomeViewData的值... 的 NULL

如果我做同样的练习,但是以文本框为例,一切正常...... 的 - 编辑 -
自从这篇文章以来我尝试过的事情:

  • 根据Phil
  • 的建议为我的操作添加[Bind(Prefix =“”)]属性
  • 添加[Bind(Prefix =“”)]以查看是否会删除“空名不允许”的错误
  • 在我的控件名称中添加我的操作参数的名称

1 个答案:

答案 0 :(得分:3)

啊,这里的问题是按照惯例,模型绑定器以“d.PropertyName”的形式查找值,因为Index操作方法的参数是“d”。

由于你可以有一个动作方法的多个参数,我们默认使用参数名作为前缀。

修复此问题很简单,只需使用Bind属性告诉MVC不要使用前缀。

[AcceptVerps(HttpVerbs.Post)]
public ActionResult Index([Bind(Prefix="")]HomeViewdata d)
相关问题