Скрытые поля форм, которые не отображаются в модели MVC после обратной записи
У меня есть новое приложение MVC 4 с довольно простым представлением/контроллером. Связанная модель содержит пару свойств, которые я сопоставил с полями Скрытые. Когда страница отображается в первый раз (например, с помощью действия HttpGet), все выглядит нормально. Но когда форма Post'ed, выбирая кнопку "Отправить", итоговая модель, представленная в Action, больше не имеет значений скрытого поля. Вот прохождение подробностей.
Вот пример Модели:
public class Application
{
public bool ShowSideBars { get; set; }
}
Вот начальный Контроллер * Action * (который, кажется, работает нормально):
[HttpGet]
public ActionResult Application()
{
var model = Request.ParseFromQueryString<Application>();
model.ShowSideBars = true;
return View(model);
}
Это сопоставляется с Вид следующим образом:
<fieldset>
@Html.HiddenFor(m => m.ShowSideBars)
...
</fieldset>
В результате создается следующая разметка, которая будет отображаться внутри набора полей:
<input data-val="true" data-val-required="The ShowSideBars field is required." id="ShowSideBars" name="ShowSideBars" type="hidden" value="True" />
Примечание. Я уверен, что я знал, почему MVC решила добавить контент "... поле обязательно", когда я не указал его по мере необходимости, но для другого вопроса
Вот Действие, которое вызывается при отправке формы. На этом этапе вышеупомянутое свойство больше не будет установлено в ' true.
[HttpPost]
public ActionResult Application(Application application)
{
// Other work done here
return View(application);
}
В настоящее время нет настраиваемых привязок модели. Кроме того, я тестировал некоторые другие типы данных, и я вижу то же самое.
Может кто-нибудь объяснить, почему скрытые значения формы не возвращаются? Я просто делаю все это неправильно?
Ответы
Ответ 1
Я не могу воспроизвести проблему (бета-версия ASP.NET MVC 4 работает на VS 2010.NET 4.0).
Модель:
public class Application
{
public bool ShowSideBars { get; set; }
}
Контроллер:
public class HomeController : Controller
{
public ActionResult Application()
{
var model = new Application();
model.ShowSideBars = true;
return View(model);
}
[HttpPost]
public ActionResult Application(Application application)
{
return Content(application.ShowSideBars.ToString());
}
}
Вид:
@model Application
@using (Html.BeginForm())
{
@Html.HiddenFor(m => m.ShowSideBars)
<button type="submit">OK</button>
}
Когда я отправляю форму, связующее устройство правильно присваивает свойству ShowSideBars
в действии POST значение true.
Примечание. Я уверен, что я знал, почему MVC решила добавить поле "...". требуемого ", когда я не указывал его по мере необходимости, но для другой вопрос
Это потому, что всегда требуются типы с нулевым значением, такие как логические. Вы можете остановить помощников ASP.NET MVC от испускания атрибутов проверки на стороне клиента HTML5 - *, поместив следующую строку в Application_Start
:
DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes = false;
Ответ 2
Если у вас есть свойство в вашей модели, украшенном ReadOnlyAttribute, значение не будет заноситься обратно в модель для вас. В конце концов, это только чтение.
Ответ 3
Я думаю, что поля ДОЛЖНЫ быть в тегах html формы для скрытых, которые должны быть отправлены назад и не игнорироваться
Ответ 4
У меня была такая же проблема. Форма не предоставила скрытое свойство, потому что у класса модели не было подходящего getter и setter для этого свойства.
Я знаю, что это не проблема, которую вы имели, просто подумал, что это может помочь другим людям, которые займут эту страницу.
Ответ 5
попробуйте следующее:
public class Model
{
[ScaffoldColumn(false)]
public bool InvisibleProperty { get; set; }
}
подробнее здесь (ScaffoldColumn (значение bool) vs HiddenInput (DisplayValue = значение bool) в MVC)
Ответ 6
В моем случае это было потому, что я объявил поле вместо свойства:
public BaseController.Modes Mode;
не работает. Но:
public BaseController.Modes Mode { get; set; }
работает. Связующее устройство по умолчанию работает только со свойствами.
Ответ 7
Я не хочу этого делать, это еще одна причина, по которой это может произойти.
Моя форма имела одно и то же поле в нем дважды. Другое поле фактически не было в форме, но это не имеет значения.
Запустите этот jQuery в консоли разработчика, чтобы узнать, сколько элементов возвращается:
$("[id$=PropertyName]"); // Search for ids ending with property name.
Пример:
![введите описание изображения здесь]()