Почему mvc Html.HiddenFor не отображает мое поле?
Я пытаюсь сделать эту простую вещь
<%= Html.HiddenFor(model => model.Id)%>
модель
[HiddenInput(DisplayValue=true)]
public int Id { get; set; }
но я всегда получаю этот рендеринг
<input type="hidden" value="0" name="UserInfo.Id" id="UserInfo_Id">
У меня есть чек, а id - НЕ 0..?!
нужно какое-то объяснение здесь...
Изменить
Проблема, похоже, следующая статья, упомянутая ниже.
Это работает
<input type="hidden" value="<%= Html.AttributeEncode(Model.Id) %>" id="<%= Html.IdFor(model=>model.Id)%>" name="<%= Html.NameFor(model=>model.Id)%>" />
Благодаря Manaf
Ответы
Ответ 1
Я не уверен, что это с вами, но Html.HiddenFor()
"не выводит правильные значения после публикации, если значение изменяется во время публикации." и это не ошибка, которая была разработана таким образом.
Подробнее Здесь
Быстрое исправление:
Не используйте помощника, попробуйте вместо этого:
<input type="hidden" value="<%= Html.AttributeEncode(model.Id) %>" id="Id" name="Id" />
Всегда работал у меня:)
Ответ 2
Чтобы добавить к правильному ответу Manaf - вы правильно заметили, что проблема возникает в действиях контроллера, которые обрабатывают сообщения. Я получал ту же проблему в действии контроллера, который обрабатывает get, когда я явно передаю модель в представление:
[HttpGet]
ActionResult SearchForSomething(SearchForm searchForm)
{
searchForm.MyId = SomeValueFromSession;
return View("SearchForSomething", searchForm);
}
В представлении эта строка, отображающая скрытый ввод для MyId, всегда отображается "0":
@Html.HiddenFor(m => m.MyId);
Предложение Per Darren Oster я изменил на следующее и устранил проблему:
[HttpGet]
ActionResult SearchForSomething(SearchForm searchForm)
{
searchForm.MyId = SomeValueFromSession;
ModelState.Clear();
return View("SearchForSomething", searchForm);
}
Ответ 3
Мой комментарий отнесен к последнему месту (даже я не смог его найти), поэтому:
Если вы не хотите очищать модельное состояние, как предложил Даррен Остер, удаление проблемного ключа для меня: ModelState.Remove("HiddenKey")
Ответ 4
Я столкнулся с этой проблемой также с помощью @Html.HiddenFor.
@Html.Hidden( "Id", Model.Id) также дал значение 0, но поле внешнего ключа, например, @Html.Hidden( "Model_Category_ModelId", Model.Category.ModelId), действительно работало, а оно @Html.HiddenFor(m = > m.Category.ModelId) не сделал.
Моим решением было перенаправить на действие get, как описано в ASP.NET MVC Post Redirect Get Pattern.