Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

Он будет работать

Ответ 3

Странно, но попробуйте с @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("...");

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

Ответ 4

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

Ответ 5

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

    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 в своих представлениях, хотя...

Ответ 6

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

Ответ 7

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

@Html.HiddenFor(model=>model.title, new {ng_init = string.Format("model.title='{0}'", Model.title) })