asp.net-mvc - Html.DropDownList 和模型绑定(bind)

标签 asp.net-mvc selectlist

为什么模型绑定(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/

相关文章:

asp.net-mvc - 为什么 Visual Studio 代码格式不能正常用于 Razor 标记?

javascript - 使用 JQuery/Json 填充选择列表的最佳方式?

javascript - ng-options 选择列表值设置为我选择的 id 并将其与 ng-model 正确绑定(bind)

asp.net-mvc - 在 MVC 中绑定(bind)到 SelectList

jQuery - 通过 .load() 多次加载模态对话框表单并选择列表中断

c# - 'IEnumerable< >' does not contain a definition for ' ' 并且找不到接受类型为 '' 的第一个参数的扩展方法 'IEnumerable<>'

asp.net-mvc - 提交同名的表单元素

c# - IIS 7 上的 nHibernate,SQLClientPermissionException

c# - 如何允许 SignalR 使用 EF6 将更新从数据库推送到浏览器

java - Vaadin - ListSelect 组件单击时取消选择