Скрытые поля форм, которые не отображаются в модели 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 для этого свойства. Я знаю, что это не проблема, которую вы имели, просто подумал, что это может помочь другим людям, которые займут эту страницу.

Ответ 6

В моем случае это было потому, что я объявил поле вместо свойства:

public BaseController.Modes Mode;

не работает. Но:

public BaseController.Modes Mode { get; set; }

работает. Связующее устройство по умолчанию работает только со свойствами.

Ответ 7

Я не хочу этого делать, это еще одна причина, по которой это может произойти.

Моя форма имела одно и то же поле в нем дважды. Другое поле фактически не было в форме, но это не имеет значения.

Запустите этот jQuery в консоли разработчика, чтобы узнать, сколько элементов возвращается:

$("[id$=PropertyName]"); // Search for ids ending with property name.

Пример:

введите описание изображения здесь