为什么模型绑定(bind)不适用于 DropDown?
我做错了什么?
为了说明我的问题,我做了以下事情:
创建了一个新的 asp.net MVC 项目 (beta1) 创建了以下类:
HomeViewData : ViewDataDictionary
+List : SelectList
在 HomeController 类中添加了一个 View 数据,如下所示
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
如果我做同样的练习,但以文本框为例,一切正常...
--编辑--
自这篇文章以来我尝试过的事情:
- 按照 Phil 的建议向我的操作添加 [Bind(Prefix="")] 属性
- 添加一个 [Bind(Prefix="")] 以查看这是否会消除“不允许使用空名称”的错误
- 在我的控件名称中添加我的操作参数的名称
最佳答案
啊,这里的问题是,按照惯例,模型绑定(bind)器正在寻找“d.PropertyName”形式的值,因为您的 Index 操作方法的参数是“d”。
由于一个 Action 方法可以有多个参数,我们默认使用参数名称作为前缀。
解决这个问题很容易,只需使用 Bind 属性告诉 MVC 不要使用前缀。
[AcceptVerps(HttpVerbs.Post)]
public ActionResult Index([Bind(Prefix="")]HomeViewdata d)
关于asp.net-mvc - Html.DropDownList 和模型绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/305913/