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

SelectList在MVC DropDownList中返回null

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

    我在使用Html时遇到了问题。MVC RC1窗体上的DropDownList帮助程序。

    在控制器类中,我创建了这样的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中添加了一个默认选项。如果我运行此页面并单击提交按钮而不做任何事情,我预计此页面的POST操作会触发,并且此下拉列表上的验证代码会告诉我我没有选择任何选项。

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

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

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

    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 beta 1升级到RC1,突然间出现了这种情况。我以前见过对SelectInternal方法的引用,但没有具体的解决方案。那么,有人能帮我弄清楚为什么会出现这个错误以及如何修复它吗?

    提前感谢

    3 回复  |  直到 17 年前
        1
  •  1
  •   Josh Darnell Eric Parshall    12 年前

    算出来了,多亏了 this link 。事实证明,当表单被回发到服务器时,我的控制器上实际上正在进行验证,但如果验证失败,控制器会尝试重新显示表单。但是,沿线的某个位置的SelectList已被设置为null,因此我也必须在该页面上重新创建SelectList。

        2
  •  2
  •   Dan Maharry    17 年前

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

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

        3
  •  1
  •   Dave The Ninja    17 年前

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

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

    忍者戴夫