HTML.HiddenFor набор значений

@Html.HiddenFor(model => model.title, new { id= "natureOfVisitField", @value = '@Model.title'})

это не работает! как установить значение?

7 ответов

Решение

Вам не нужно устанавливать значение в параметре attribute. MVC должен автоматически связать его для вас.

@Html.HiddenFor(model => model.title, new { id= "natureOfVisitField" })

Для установки значения в скрытом поле выполните следующее:

@Html.HiddenFor(model => model.title, 
                new { id= "natureOfVisitField", Value = @Model.title})

Это будет работать

Странно, но, попробуйте с @Value, заглавной "V"

например (работает на MVC4)

@Html.HiddenFor(m => m.Id, new { @Value = Model.Id })

Обновить:

Обнаружено, что @Value (заглавная V) создает еще один атрибут со значением "Value" наряду со значением "value", при этом использование маленького @value, похоже, тоже работает!

Необходимо проверить исходный код MVC, чтобы найти больше.


Обновление, пройдя через как это работает внутри:

Прежде всего, забудьте обо всех этих обходных путях (я продолжил здесь ради преемственности), теперь выглядит глупо:)

По сути, это происходит, когда модель публикуется и модель возвращается на ту же страницу.

К значению обращаются (и формируют в html) в методе InputHelper (InputExtensions.cs), используя следующий фрагмент кода

string attemptedValue = (string)htmlHelper.GetModelStateValue(fullName, typeof(string));

Метод GetModelStateValue (в Htmlelper.cs) извлекает значение как

ViewData.ModelState.TryGetValue(key, out modelState)

Здесь проблема, так как значение доступно из словаря ViewData.ModelState. Это возвращает значение, отправленное со страницы вместо измененного значения!!

т. е. если опубликованное значение переменной (например, Person.Id) равно 0, но вы устанавливаете значение в действии httpPost (например, Person.Id = 2), ModelState по-прежнему сохраняет старое значение "0", а предпринятое значение содержит "0".! поэтому поле на отображаемой странице будет содержать "0" в качестве значения!!

Обходной путь, если вы возвращаете модель на ту же страницу: Очистите элемент из ModelState, например ModelState.Remove("Id");

Это удалит элемент из словаря, и ViewData.ModelState.TryGetValue(key, out modelState) вернет ноль, а следующий оператор (внутри InputExtensions.cs) примет фактическое значение (valueParameter), переданное в HiddenFor(m => m.Id).)

это делается в следующей строке в InputExtensions.cs

tagBuilder.MergeAttribute("value", attemptedValue ?? ((useViewData) ? htmlHelper.EvalString(fullName, format) : valueParameter), isExplicitValue);

Сводка: очистите элемент в ModelState с помощью ModelState.Remove("...");

Надеюсь, это полезно.

Это просто значение, а не @ значение. Попробуйте. Я не уверен насчет @Model.title, может быть, это просто Model.title

Этот вопрос не решен, потому что я сам столкнулся с проблемой при попытке добавить связанное свойство к существующей сущности. Я только что закончил делать хороший метод расширения:

    public static MvcHtmlString HiddenFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, TProperty value)
    {
        string expressionText = ExpressionHelper.GetExpressionText(expression);
        string propertyName = htmlHelper.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(expressionText);

        return htmlHelper.Hidden(propertyName, value);
    }

Используйте вот так:

@Html.HiddenFor(m => m.RELATED_ID, Related.Id)

Обратите внимание, что эта сигнатура похожа на встроенную HiddenFor, но использует универсальную типизацию, поэтому, если Value имеет тип System.Object, вы фактически будете вызывать ту, которая встроена в каркас. Не уверен, почему вы будете редактировать свойство типа System.Object в своих представлениях...

Символ @ при указании HtmlAttributes используется, когда "вещь", которую вы пытаетесь установить, является ключевым словом C#. Так, например, слово класс, вы не можете указать класс, вы должны использовать @class.

Вы можете сделать это так

@Html.HiddenFor(model=>model.title, new {ng_init = string.Format("model.title='{0}'", Model.title) })
Другие вопросы по тегам