3

为什么模型绑定不能在 DropDown 上工作?
我究竟做错了什么?
为了说明我的问题,我做了以下事情:

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

HomeViewData : ViewDataDictionary  
+List : SelectList

向 HomeController 类添加了一个视图数据,如下所示

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 的漂亮下拉列表的页面。
然后在选择一个值后,我按下回车键(不用提交按钮),看看我的断点是如何停止代码的。我检查 HomeViewData 的值... NULL

如果我做同样的练习,但例如使用文本框,一切都很好......
--EDIT--
自从这篇文章以来我尝试过的事情:

  • 按照 Phil 的建议,在我的操作中添加 [Bind(Prefix="")] 属性
  • 添加 [Bind(Prefix=" ")] 以查看这是否会消除“不允许使用空名称”的错误
  • 在我的控件名称中添加我的操作参数的名称
4

1 回答 1

3

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

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

解决这个问题很容易,只需使用 Bind 属性告诉 MVC 不要使用前缀。

[AcceptVerps(HttpVerbs.Post)]
public ActionResult Index([Bind(Prefix="")]HomeViewdata d)
于 2008-11-21T17:15:45.580 回答