@ Html.HiddenFor не работает со списками в ASP.NET MVC - PullRequest
82 голосов
/ 22 февраля 2012

Я использую модель, которая содержит список в качестве свойства. Я заполняю этот список элементами, которые я беру с SQL Server. Я хочу, чтобы список был скрыт в представлении и передан действию POST. Позже я могу захотеть добавить больше элементов в этот список с помощью jQuery, что делает массив непригодным для расширения в дальнейшем. Обычно вы используете

@Html.HiddenFor(model => model.MyList)

для выполнения этой функции, но по какой-то причине список в POST всегда равен нулю.

Очень простой вопрос, кто-нибудь знает, почему MVC ведет себя так?

Ответы [ 12 ]

1 голос
/ 20 сентября 2017

может быть поздно, но я создал метод расширения для скрытых полей из коллекции (с элементами простого типа данных):

Итак, вот оно:

/// <summary>
/// Returns an HTML hidden input element for each item in the object's property (collection) that is represented by the specified expression.
/// </summary>
public static IHtmlString HiddenForCollection<TModel, TProperty>(this HtmlHelper<TModel> html, Expression<Func<TModel, TProperty>> expression) where TProperty : ICollection
{
    var model = html.ViewData.Model;
    var property = model != null
                ? expression.Compile().Invoke(model)
                : default(TProperty);

    var result = new StringBuilder();
    if (property != null && property.Count > 0)
    {
        for(int i = 0; i < property.Count; i++)
        {
            var modelExp = expression.Parameters.First();
            var propertyExp = expression.Body;
            var itemExp = Expression.ArrayIndex(propertyExp, Expression.Constant(i));

            var itemExpression = Expression.Lambda<Func<TModel, object>>(itemExp, modelExp);

            result.AppendLine(html.HiddenFor(itemExpression).ToString());
        }
    }

    return new MvcHtmlString(result.ToString());
}

Использование так же просто, как:

@Html.HiddenForCollection(m => m.MyList)
1 голос
/ 25 июня 2014

Другой возможный способ исправить это - присвоить каждому объекту в вашем Списке идентификатор, затем использовать @Html.DropDownListFor(model => model.IDs) и заполнить массив, содержащий идентификаторы.

...