当前位置:  开发笔记 > 后端 > 正文

ASP.NET MVC - Html.DropDownList - 未通过ViewData.Model设置的值

如何解决《ASP.NETMVC-Html.DropDownList-未通过ViewData.Model设置的值》经验,为你挑选了2个好方法。

刚刚开始玩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(工作正常)并将选择列表与模型一起传递 - 这将带来好处清理代码有点 - 我只是想知道为什么这个方法不起作用....

非常感谢任何建议



1> stun..:

其实,你只需要传递nullHtml.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(测试版).

更新说明:2012年1月31日

在过去3年中广泛使用ASP.NET MVC后,我更喜欢使用additionalViewDataHtml.EditorFor()方法.

[List Items]作为anonymous与Model的属性具有相同属性名称的对象传入Html.EditorFor()方法.

<%= Html.EditorFor(
    m => m.MyPropertyName,
    new { MyPropertyName = Model.ListItemsForMyPropertyName }
) %>

如果您想了解更多详情,请参阅我在另一个主题中的答案.



2> Todd Smith..:

经过一堆折边和讨厌后,它归结为以下代码行

if (ViewData.ModelState.TryGetValue(key, out modelState))

这意味着MVC只是通过查看ViewData Dictionary <>对象而不是遍历到ViewData.Model对象来尝试解析该值.

无论这是一个错误,限制还是设计决定,我都不确定.但是,您可以通过以下方式修复它:

<%= Html.TextBox("MyTextBox", ViewData.Model.MyTextBox) %>


感谢Todd的建议,正如我在帖子中提到的,如果使用模型,你可以使用:var model {MyList = new SelectList(items,"Value","Text",selected_value)},只需:<% = Html.DropDownList( "MYLIST")%>
推荐阅读
依然-狠幸福
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有