17

刚刚开始使用 ASP.NET MVC 并偶然发现了以下情况。感觉很像一个错误,但如果不是,我们将不胜感激:)

视图包含非常基本的东西

<%=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 构造函数上设置所选项目,而不是使用视图数据(工作正常)并将选择列表与模型一起传递——这将有好处稍微清理一下代码 - 我只是想知道为什么这种方法不起作用....

非常感谢您的任何建议

4

7 回答 7

23

实际上,您只需null通过Html.DropDownList().
我遇到了同样的问题,并使用反射器查看了 MVC 源代码。

System.Web.Mvc.Extensions.SelectExtensions类的SelectInternal()方法中,它检查selectList参数是否为。如果它作为 传入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 之后,我更喜欢使用additionalViewDatafromHtml.EditorFor()方法

将[List Items]作为与模型属性具有相同属性名称anonymous的对象传递到方法中。 Html.EditorFor()

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

如果您想了解更多详细信息,请在此处参考我在另一个线程中的回答

于 2009-11-24T01:51:02.803 回答
5

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

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

这意味着 MVC 试图通过仅查看 ViewData Dictionary<> 对象而不遍历 ViewData.Model 对象来解析该值。

我不确定这是错误、限制还是设计决定。但是,您可以通过以下方式修复它:

<%= Html.TextBox("MyTextBox", ViewData.Model.MyTextBox) %>
于 2008-12-23T23:13:24.093 回答
2

创建 SelectList 集合时,尝试在控制器操作中设置选定的值。

ViewData["AddressTypeId"] = new SelectList(CustomerService.AddressType_List(), "AddressTypeId", "Name", myItem.AddressTypeId );

于 2009-03-25T14:32:44.957 回答
2

我在这里显然迟到了。但我想添加此评论以防其他人遇到此问题。

在 MVC 2 中。您可以执行以下操作来选择项目...

public ActionResult Edit(int id)
        {
            Team team = _db.TeamSet.First(m => m.TeamID == id);
            var fanYear = from c in _db.FanYearSet select c;
            ViewData["FantasyYear"] = new SelectList(fanYear, "YearID", "FantasyYear", team.FanYearReference.EntityKey.EntityKeyValues[0].Value);
            var league = from c in _db.LeagueSet select c;
            ViewData["League"] = new SelectList(league, "LeagueID", "League_Name", team.LeaguesReference.EntityKey.EntityKeyValues[0].Value);

            return View(team);
        }

第四个参数接受一个值,并将在下拉列表中选择您想要的值。在我的示例中,我有一个名为 team 的表,并且我将关系设置为一个名为 fanYear 和 League 的表。

你可以看到我首先得到了我正在编辑的球队,然后建立了一个梦幻年的下拉列表和另一个联赛的下拉列表。为了确定球队的年份和联赛,我不得不使用实体参考。

只是想把它放在那里。我找不到任何这样做的例子。

于 2010-12-11T16:49:16.953 回答
-1

好的,我可能会从这个线程中遗漏一些东西,但是在 C# 中,以下工作:

Html.DropDownList("ProfessionGuid", (SelectList)ViewData["Professions"])

其中 ' ProfessionGuid' 是要在列表中选择的值。

在 VB.Net 我相信它会是:

Html.DropDownList("ProfessionGuid", ViewData["Professions"] AS SelectList)
于 2009-10-27T12:05:25.063 回答
-1

当您遇到无效或空 ViewData 问题时,请注意控制器的操作。

假设您有一个名为 MyList 的 ViewData 用于 Html.DropDownlist,名为 MyList。

如果您致电ModelState.AddModelError("MyList","Please select the profession"),您将使用此警告文本替换您的 ViewData 列表内容。

这也是为什么互联网上的人们对 DropDownList 上的 ViewData 有空问题的原因。

最重要的是,请注意您在错误模型上的 ID,它们不得干扰您的 html 控件。

于 2010-04-09T21:11:35.210 回答
-1

我对此的担忧是您只能将列表用于一个字段。我有多个用户字段的实体,所以我使用以下内容:

< %= Html.DropDownList("fieldAAA", 
                       new SelectList( (IEnumerable) ViewData["Users"], "Value", "Text", fieldAAA))

%> 
于 2010-09-15T20:42:16.670 回答