Скрытые поля формы не отображаются в модели MVC после постбека - PullRequest
11 голосов
/ 19 марта 2012

У меня есть новое приложение MVC 4 с довольно простым View / Controller. Связанная Модель содержит пару свойств, которые я сопоставил с Скрытыми полями формы. Когда страница отображается в первый раз (, например, с помощью HttpGet Action ), все выглядит нормально. Но когда форма отправляется после нажатия кнопки «Отправить», полученная модель, представленная в действии, больше не имеет значений скрытого поля. Вот краткое изложение подробностей.

Вот образец модели :

public class Application
{
    public bool ShowSideBars { get; set; }
}

Вот начальный Контроллер * Действие * (, которое, кажется, работает нормально ):

[HttpGet]
public ActionResult Application()
{
    var model = Request.ParseFromQueryString<Application>();
    model.ShowSideBars = true;

    return View(model);
}

Это сопоставляется с View следующим образом:

<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);
}

В настоящее время нет пользовательских моделей Binder. Кроме того, я протестировал некоторые другие типы данных, и я вижу то же самое.

Может кто-нибудь объяснить, почему скрытые значения формы не возвращаются? Я просто делаю все это неправильно?

Ответы [ 7 ]

10 голосов
/ 12 октября 2012

Если у вас есть свойство в вашей модели, украшенное атрибутом ReadOnlyAttribute, значение не будет заполнено обратно в модель для вас.В конце концов, это только для чтения.

7 голосов
/ 20 марта 2012

Я не могу воспроизвести проблему (ASP.NET MVC 4 Beta работает на 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 решил добавить контент «... поле обязательно для заполнения», когда я не пометил его как обязательный, но это для другого вопроса

Это потому, что типы, не допускающие значения типа NULL, такие каклогические значения всегда требуются.Можно помешать помощникам ASP.NET MVC выдавать для них атрибуты проверки на стороне клиента HTML5-данных- *, поместив следующую строку в Application_Start:

DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes = false;
6 голосов
/ 12 апреля 2016

Я думаю, что поля ДОЛЖНЫ быть в пределах тегов html формы, чтобы скрытые были отправлены обратно и не игнорировались

4 голосов
/ 31 марта 2016

У меня просто была такая же проблема. Форма не представила скрытое свойство, потому что класс модели не имел правильных getter и setter для этого свойства. Я знаю, что это не та проблема, с которой вы столкнулись, просто подумал, что это может помочь другим людям, которые будут давать взаймы на этой странице.

0 голосов
/ 09 августа 2017

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

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

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

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

Пример:

enter image description here

0 голосов
/ 05 мая 2017

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

public BaseController.Modes Mode;

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

public BaseController.Modes Mode { get; set; }

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

0 голосов
/ 21 апреля 2014

попробуйте это:

public class Model
{
    [ScaffoldColumn(false)]
    public bool InvisibleProperty { get; set; }
}

больше информации здесь (ScaffoldColumn (значение bool) против HiddenInput (DisplayValue = значение bool) в MVC)

...