在我的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
值。可能是什么导致了这个?通常,当我在POST操作中执行return View(model)
时,所有模型属性都会在设置时正确呈现。
答案 0 :(得分:2)
当重新显示已发布的页面时,Html Helper方法将首先查找已发布的值以重新显示该表单。如果他们找不到值,他们将从模型对象中取而代之。在执行ModelState
之前,您可以采取哪些措施来清除return
:
model.DirBlocked = true;
ModelState.Clear();
return View(model);
但是,这将清除任何未传递回视图的用户输入数据的形式,并且还将清除任何验证消息。有关ModelState的更多信息,请参阅https://msdn.microsoft.com/en-us/library/system.web.mvc.modelstatedictionary.aspx。
答案 1 :(得分:2)
实际上HtmlHelper不使用Model而是使用ModelState。您可以通过避免使用html帮助程序并直接使用模型字段来解决此问题。