我在MVC RC1表单上使用Html.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方法的引用,但没有具体的解决方案。所以任何人都可以帮我弄清楚为什么会出现这种错误以及如何解决它?
提前致谢
答案 0 :(得分:2)
通过this link计算出来。事实证明,当表单被发布回服务器时,我的控制器上确实发生了验证,但如果验证失败,控制器会尝试重新显示表单。但是,SelectLists已在某行的某处重新设置为null,因此我不得不在该页面上重新创建SelectLists。
我不确定这是MVC中的错误还是我自己的错误,但作为参考,有解决方案。干杯。
答案 1 :(得分:1)
您是否重新升级到RC1刷新?
http://www.haacked.com/archive/2009/01/30/aspnetmvc-refresh.aspx
他们解决了很多问题。在升级到刷新之前,我几乎100%确定我遇到过类似的错误。
忍者戴夫 p>
答案 2 :(得分:1)
这不是MVC中的错误,而是设计(AFAIK)
您需要重新设置viewdata并将模型返回到视图。
视图数据仅存在于当前请求+ 1(即回发后)。