【问题标题】:Html.DropDownList and modelbindingHtml.DropDownList 和模型绑定
【发布时间】:2008-11-24 16:58:07
【问题描述】:

为什么模型绑定在 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 的值...

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

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

【问题讨论】:

    标签: asp.net-mvc selectlist


    【解决方案1】:

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

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

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

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

    【讨论】:

    • Phil,今天我在演示页面上测试了您的答案。我收到一个错误,名称不能为空。所以我将绑定属性更改为 [Bind(Prefix="")] 现在它可以正常工作,而且结果与我开始时的结果相同。
    • 我认为 SO 解析器会删除 cmets 中引号之间的空格。所以应该是 [Bind(Prefix="[aSpace]")]
    • 然后我反过来尝试:我尝试在我的 aspx 页面中制作 Html 助手,如下所示
    • 如果您进行更改,您需要确保 ViewData["d.List"] 包含下拉列表的项目。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多