Почему это значение модели представления не отображается правильно? - PullRequest
0 голосов
/ 25 апреля 2018

В моем UploadFilesViewModel У меня есть свойство:

[HiddenInput(DisplayValue = false)]
public bool DirBlocked { get; set; }

и, на мой взгляд, следующая разметка для него:

@Html.HiddenFor(m => m.DirBlocked)

Когда я выполняю следующий код в своем действии GET:

var model = new UploadFilesViewModel { UserBaseDir = await GetUserBaseDirAsync() };
model.DirBlocked = true;
return View(model);

Скрытый ввод для DirBlocked выглядит следующим образом:

<input data-val="true" data-val-required="The DirBlocked field is required." id="DirBlocked" name="DirBlocked" type="hidden" value="True">

Тем не менее, когда я выполняю следующий код в действии POST:

// Hard 'true' just for debugging.
//if (files.Any() && !HasDirAccess(model.UploadDir))
if (true)
{
    model.DirBlocked = true;
    return View(model);
}

Тот же скрытый ввод отображается следующим образом:

<input data-val="true" data-val-required="The DirBlocked field is required." id="DirBlocked" name="DirBlocked" type="hidden" value="False"> 

То есть он теряет значение true, присвоенное свойству DirBlocked. Что может быть причиной этого? Обычно, когда я выполняю return View(model) в действии POST, все свойства модели отображаются правильно, так как они установлены.

Ответы [ 2 ]

0 голосов
/ 25 апреля 2018

На самом деле HtmlHelper не использует Model, а ModelState. Вы можете решить эту проблему, избегая html-помощника и напрямую используя поле модели.

0 голосов
/ 25 апреля 2018

При повторном отображении опубликованной страницы, Html Helper-методы сначала будут искать опубликованное значение для повторного отображения формы. Если они не могут найти значение, они вместо этого возьмут его из объекта модели. Чтобы предотвратить это, нужно очистить ModelState перед выполнением return:

model.DirBlocked = true;
ModelState.Clear(); 
return View(model);

Это, однако, очистит форму любых введенных пользователем данных, не переданных обратно в представление, а также очистит все сообщения проверки. См. https://msdn.microsoft.com/en-us/library/system.web.mvc.modelstatedictionary.aspx для получения дополнительной информации о ModelState.

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