刚刚开始玩ASP.NET MVC并且偶然发现了以下情况.感觉很像一个bug,但如果不是,一个解释将不胜感激:)
视图包含非常基本的东西
<%=Html.DropDownList("MyList", ViewData["MyListItems"] as SelectList)%> <%=Html.TextBox("MyTextBox")%>
不使用模型时,值和所选项目按预期设置:
//works fine public ActionResult MyAction(){ ViewData["MyListItems"] = new SelectList(items, "Value", "Text"); //items is an ienumerable of {Value="XXX", Text="YYY"} ViewData["MyList"] = "XXX"; //set the selected item to be the one with value 'XXX' ViewData["MyTextBox"] = "ABC"; //sets textbox value to 'ABC' return View(); }
但是当尝试通过模型加载时,文本框的值设置为预期,但下拉列表不会获得选定的项目集.
//doesnt work public ActionResult MyAction(){ ViewData["MyListItems"] = new SelectList(items, "Value", "Text"); //items is an ienumerable of {Value="XXX", Text="YYY"} var model = new { MyList = "XXX", //set the selected item to be the one with value 'XXX' MyTextBox = "ABC" //sets textbox value to 'ABC' } return View(model); }
有任何想法吗?我当前的想法是,也许在使用模型时,我们仅限于在SelectList构造函数上设置所选项而不是使用viewdata(工作正常)并将选择列表与模型一起传递 - 这将带来好处清理代码有点 - 我只是想知道为什么这个方法不起作用....
非常感谢任何建议
其实,你只需要传递null
的Html.DropDownList()
.
我遇到了同样的问题,并使用Reflector查看MVC源代码.
在System.Web.Mvc.Extensions.SelectExtensions
类的SelectInternal()
方法中,它检查selectList参数是否为null.如果它被传入null
,它会SelectList
正确查找.
这是"代码隐藏".
ViewData["MyDropDown"] = new SelectList(selectListItems, "Value", "Text", selectedValue.ToString() );
这是HTML视图代码.
<%= Html.DropDownList("MyDropDown", null, "** Please Select **", new { @class = "my-select-css-class" } ) %>
注意:我正在使用ASP.NET MVC 2.0(测试版).
在过去3年中广泛使用ASP.NET MVC后,我更喜欢使用additionalViewData
该Html.EditorFor()
方法.
将[List Items]作为anonymous
与Model的属性具有相同属性名称的对象传入Html.EditorFor()
方法.
<%= Html.EditorFor( m => m.MyPropertyName, new { MyPropertyName = Model.ListItemsForMyPropertyName } ) %>
如果您想了解更多详情,请参阅我在另一个主题中的答案.
经过一堆折边和讨厌后,它归结为以下代码行
if (ViewData.ModelState.TryGetValue(key, out modelState))
这意味着MVC只是通过查看ViewData Dictionary <>对象而不是遍历到ViewData.Model对象来尝试解析该值.
无论这是一个错误,限制还是设计决定,我都不确定.但是,您可以通过以下方式修复它:
<%= Html.TextBox("MyTextBox", ViewData.Model.MyTextBox) %>