代码之家  ›  专栏  ›  技术社区  ›  Dan Maharry

在MVC DropDownList中,SelectList返回为空值

  •  4
  • Dan Maharry  · 技术社区  · 16 年前

    在MVC RC1窗体上使用html.dropdownlist帮助程序时遇到问题。

    在Controller类中,我创建这样的SelectList

    SelectList selectList = new SelectList(db.SiteAreas, "AreaId", "AreaName");
    ViewData["AreaId"] = selectList;
    

    或者像这样

    IEnumerable<SelectListItem> areaList =
        from area in db.SiteAreas
        select new SelectListItem
        {
            Text = area.AreaName,
            Value = area.AreaId.ToString(),
            Selected = false
        };
    ViewData["AreaId"] = areaList;
    

    然后使用此调用将其添加到查看器中

    <% using (Html.BeginForm())
       { %>
       <label for="sitearea">Site Area:</label>
       <span class="hint">The menu option to be highlighted when the page is open </span>
       <br />
       <%= Html.DropDownList("sitearea", (SelectList)ViewData["AreaId"], "Select Area Id")%>
       <%= Html.ValidationMessage("sitearea") %>
       <br />
       <br />
       <input type="submit" value="Add New Page" />
       <% = Html.AntiForgeryToken() %>
    <% } %>
    

    所以我也给DropDownlist添加了一个默认选项。如果我运行此页面并单击提交按钮而不做任何操作,我希望触发此页面的发布操作,并希望此下拉列表上的验证代码告诉我没有选择任何选项。

    相反,(在将MVC源代码附加到我的项目之后),我发现我在selectextensions.cs中得到了argumentNullException。

    $exception  {"Value cannot be null.\r\nParameter name: selectList"} System.Exception {System.ArgumentNullException}
    

    这与一个名为SelectInternal的方法有关,该方法的SelectList参数需要一个非空的值。

    private static string SelectInternal(this HtmlHelper htmlHelper, string optionLabel, string name, IEnumerable<SelectListItem> selectList, bool usedViewData, bool allowMultiple, IDictionary<string, object> htmlAttributes) 
    {
       if (String.IsNullOrEmpty(name)) {
          throw new ArgumentException(MvcResources.Common_NullOrEmpty, "name");
       }
       if (selectList == null) {
          throw new ArgumentNullException("selectList");
       }  
    .. rest of method ..
    

    现在,我所做的就是将代码从MVC测试版1升级到RC1,然后突然出现了这种情况。我以前见过这个selectInternal方法的引用,但没有具体的解决方案。那么,有人能帮我弄清楚为什么会发生这个错误以及如何修复它吗?

    提前谢谢

    3 回复  |  直到 16 年前
        1
  •  1
  •   Josh Darnell Eric Parshall    10 年前

    这不是MVC中的bug,而是按设计的(afaik)

    您需要重新设置视图数据并将模型返回到视图。

    视图数据只存在于当前请求+1(即回发)中。

        2
  •  2
  •   Dan Maharry    16 年前

    知道了,多亏了 this link . 结果是,当表单发布回服务器时,验证实际上正在我的控制器上进行,但如果验证失败,控制器将尝试重新显示表单。但是,selectlist在这一行的某个地方被设置回了空值,因此我不得不在该页上重新创建selectlist。

    我不确定这是MVC中的一个bug还是我自己的一个bug,但作为参考,这里有解决方案。干杯。

        3
  •  1
  •   Dave The Ninja    16 年前

    您是否已重新升级到RC1刷新?

    http://www.haacked.com/archive/2009/01/30/aspnetmvc-refresh.aspx

    他们解决了很多问题。我几乎100%确信在升级到刷新之前遇到过类似的错误。

    忍者戴夫