2009-02-12 34 views
4

我在使用MVC RC1表单上的Html.DropDownList助手时遇到了问题。SelectList在MVC中返回为null DropDownList

在控制器类,我创建这样

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

一个的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方法的引用,但没有具体的解决方法。所以任何人都可以帮我弄清楚为什么会出现这个错误以及如何解决它?

在此先感谢

+0

查看我的DDL教程http://www.asp.net/mvc/tutorials/javascript/working-with-the-dropdownlist-box-and-jquery/using-the-dropdownlist-helper-with-aspnet-mvc和http://blogs.msdn.com/b/rickandy/archive/2012/01/09/cascasding-dropdownlist-in-asp-net-mvc。aspx – RickAndMSFT 2012-02-14 19:22:15

回答

1

这不是MVC一个错误,是由设计(据我所知)

你需要重新设置您的可视数据并返回模型回视图。

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

+0

啊发生的。感谢那些信息。我想知道为什么这在beta 1 MVC中从来不是问题? – Hmobius 2009-02-13 13:58:30

2

想通了,感谢this link。事实证明,当表单发回服务器时,实际上在我的控制器上发生了验证,但如果验证失败,控制器将尝试重新显示表单。但是,SelectLists已经被设置回null,因此我不得不在该页面上重新创建SelectLists。

我不确定这是MVC中的错误还是我自己的错误,但仅供参考,还有解决方案。干杯。