Html помощник DropDownList с обнуляемой моделью выдает ArgumentException - PullRequest
1 голос
/ 22 декабря 2011

Модель

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())

new ViewDataDictionary() добавлено в соответствии с ответом в asp.net mvc renderpartial с нулевой моделью получает неправильный тип . Без этой неправильной модели виден в частичном представлении, когда значение свойства равно нулю. Когда значения свойства не равны NULL, его можно использовать

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

, но все равно приводит к той же ошибке, что и вставленная выше.

1 Ответ

1 голос
/ 22 декабря 2011

Проблема в том, что .DropDownListFor(m => m, ... использует лямбда-выражение для создания имени входа.Однако m => m не содержит свойства, поэтому имя отсутствует.

Это может сработать, если вместо этого вы используете m => m.Value, поскольку, поскольку это лямбда-выражение, оно на самом деле может не выполняться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...