chr*_*isb 17 asp.net-mvc html-helper
刚刚开始玩ASP.NET MVC并且偶然发现了以下情况.感觉很像一个bug,但如果不是,一个解释将不胜感激:)
视图包含非常基本的东西
<%=Html.DropDownList("MyList", ViewData["MyListItems"] as SelectList)%>
<%=Html.TextBox("MyTextBox")%>
Run Code Online (Sandbox Code Playgroud)
不使用模型时,值和所选项目按预期设置:
//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();
}
Run Code Online (Sandbox Code Playgroud)
但是当尝试通过模型加载时,文本框的值设置为预期,但下拉列表不会获得选定的项目集.
//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);
}
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?我当前的想法是,也许在使用模型时,我们仅限于在SelectList构造函数上设置所选项而不是使用viewdata(工作正常)并将选择列表与模型一起传递 - 这将带来好处清理代码有点 - 我只是想知道为什么这个方法不起作用....
非常感谢任何建议
stu*_*tun 23
其实,你只需要传递null的Html.DropDownList().
我遇到了同样的问题,并使用Reflector查看MVC源代码.
在System.Web.Mvc.Extensions.SelectExtensions类的SelectInternal()方法中,它检查selectList参数是否为null.如果它被传入null,它会SelectList正确查找.
这是"代码隐藏".
ViewData["MyDropDown"] = new SelectList(selectListItems,
"Value",
"Text",
selectedValue.ToString()
);
Run Code Online (Sandbox Code Playgroud)
这是HTML视图代码.
<%= Html.DropDownList("MyDropDown", null,
"** Please Select **",
new { @class = "my-select-css-class" }
) %>
Run Code Online (Sandbox Code Playgroud)
注意:我正在使用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 }
) %>
Run Code Online (Sandbox Code Playgroud)
如果您想了解更多详情,请参阅我在另一个主题中的答案.
经过一堆折边和讨厌后,它归结为以下代码行
if (ViewData.ModelState.TryGetValue(key, out modelState))
Run Code Online (Sandbox Code Playgroud)
这意味着MVC只是通过查看ViewData Dictionary <>对象而不是遍历到ViewData.Model对象来尝试解析该值.
无论这是一个错误,限制还是设计决定,我都不确定.但是,您可以通过以下方式修复它:
<%= Html.TextBox("MyTextBox", ViewData.Model.MyTextBox) %>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
80217 次 |
| 最近记录: |