Значение не отображается заполненным в представлении - PullRequest
0 голосов
/ 10 сентября 2018

У меня здесь странная проблема.

в модели (.cs):

    public long? ContactoAdditionalId { get; set; }
    public long Test1 { get; set; }
    public long? Test2 { get; set; }
    public string Test3 { get; set; }

В контроллере (в конце действия непосредственно перед просмотром):

    [HttpPost]
    [AllowAnonymous]
    public ActionResult Index( Contacto model )
    {
        DoSomeStuff( model, ... );

        (...)

        model.Test1 = model.ContactoAdditionalId.HasValue ? model.ContactoAdditionalId.Value : -1;
        model.Test2 = model.ContactoAdditionalId;
        model.Test3 = model.ContactoAdditionalId.HasValue ? model.ContactoAdditionalId.Value.ToString() : "No value!";
        return View( model );
    }

Наконец, в представлении (.cshtml):

@using MyApp.Models;

@model Contacto

@using ( Html.BeginForm( "Index", "Contacto" ) )
{
    @Html.HiddenFor( model => model.ContactoAdditionalId )
    @Html.HiddenFor( model => model.Test1 )
    @Html.HiddenFor( model => model.Test2 )
    @Html.HiddenFor( model => model.Test3 )
    (...)

Как вы уже догадались, ContactoAdditionalId (я оставил его с настоящим именем на случай, если ТО является проблемой) имеет значение НЕ , появляющееся в представлении.

Когда я нажимаю F12 в Chrome, чтобы открыть Инструменты разработчика и проверять HTML, не имеет значения для ContactoAdditionalId , но есть значения ARE для Test1, Test2 и Test3.

Обратите внимание, что я использовал длинный, длинный? и строка, чтобы проверить, связана ли проблема с типами, но все три показывают значение в HTML.

Конечно, цель этого скрытого поля - вернуть этот ContactoAdditionalId при POST'ing. Таким образом, он не работает, а его свойство модели равно нулю!

Я также заметил кое-что странное: если я добавлю в View, как раз перед HiddenFor:

@Html.DisplayFor( model => model.ContactoAdditionalId, ... )

Это неожиданно работает, и теперь скрытое поле имеет значение!

Что здесь происходит? Я выполнил пошаговую отладку в Visual Studio 2017, и когда я достиг конца кода действия, он начал переходить в представление cshtml, поэтому никакого дополнительного кода (насколько я знаю, по крайней мере, не код нашего проекта) выполняется после действия и перед преобразованием представления в HTML.

1 Ответ

0 голосов
/ 10 сентября 2018

У вас, вероятно, есть параметр в ModelState с тем же именем, что у вас нет данных.Если вы изменяете это значение в Model, не удаляя его из ModelState, HiddenFor сначала выберет поле ModelState.Либо выполните ModelState.Clear (), либо удалите только поле с ModelState.Remove ("ContactoAdditionalId") "

Также вы можете использовать ModelState.Clear ().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...