为什么此viewmodel值无法正确呈现?

时间:2018-04-25 04:52:30

标签: asp.net asp.net-mvc asp.net-core-mvc

在我的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)时,所有模型属性都会在设置时正确呈现。

2 个答案:

答案 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帮助程序并直接使用模型字段来解决此问题。