具有可空模型的Html助手DropDownList抛出ArgumentException

时间:2011-12-21 22:23:33

标签: asp.net-mvc asp.net-mvc-3

模型

namespace Models
{
    public class PartialTestModel
    {
        public int? NullableProp { get; set; }
    }
}

这很好用

<div class="highlight1">
    @Html.DropDownListFor(m => m.NullableProp, new SelectList(Enumerable.Range(1, 10), Model.NullableProp), "-- Select one --")
</div>

但是,如果为此属性创建了部分视图

@model System.Int32?

<div class="highlight1">
    Model's value is

    @if (@Model.HasValue)
    {
        @Model.ToString()
    }
    else
    { 
        <text>Null</text>
    }

    @Html.DropDownListFor(m => m, new SelectList(Enumerable.Range(1, 10), Model), "-- Select one --")
</div>

它会抛出错误

Value cannot be null or empty.
Parameter name: name

[ArgumentException: Value cannot be null or empty.
Parameter name: name]
   System.Web.Mvc.Html.SelectExtensions.SelectInternal(HtmlHelper htmlHelper, String optionLabel, String name, IEnumerable`1 selectList, Boolean allowMultiple, IDictionary`2 htmlAttributes) +396232
   System.Web.Mvc.Html.SelectExtensions.DropDownListFor(HtmlHelper`1 htmlHelper, Expression`1 expression, IEnumerable`1 selectList, String optionLabel, IDictionary`2 htmlAttributes) +35
   System.Web.Mvc.Html.SelectExtensions.DropDownListFor(HtmlHelper`1 htmlHelper, Expression`1 expression, IEnumerable`1 selectList, String optionLabel) +14

视图将部分呈现为

@Html.Partial("_PartialTest", Model.NullableProp, new ViewDataDictionary())
根据{{​​3}}中的答案添加了

new ViewDataDictionary()。如果属性值为null,则在部分视图中看不到此错误模型。当属性值不为null时,可以使用

@Html.Partial("_PartialTest", Model.NullableProp)

但仍然会产生与上面粘贴的错误相同的错误。

1 个答案:

答案 0 :(得分:1)

问题是.DropDownListFor(m => m, ...使用lambda表达式来创建输入的名称。但是,m => m不包含属性,因此没有名称。

如果您改为使用m => m.Value,它可能会有效,因为这是一个lambda表达式,它实际上可能不会被执行。