@Html.HiddenFor(model => model.title, new { id= "natureOfVisitField", @value = '@Model.title'})
он не работает! как установить значение?
@Html.HiddenFor(model => model.title, new { id= "natureOfVisitField", @value = '@Model.title'})
он не работает! как установить значение?
Вам не нужно устанавливать значение в параметре атрибутов. 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" и значение trytedValue содержит "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) })