代码之家  ›  专栏  ›  技术社区  ›  ProfK

为什么此viewmodel值不能正确渲染?

  •  4
  • ProfK  · 技术社区  · 6 年前

    在我的 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 分配给的值 已阻止 所有物这可能是什么原因造成的?通常当我做 return View(model) 在后期操作中,所有模型属性在设置时都会正确渲染。

    2 回复  |  直到 6 年前
        1
  •  2
  •   JLe    6 年前

    当重新显示发布的页面时,Html助手方法将首先查找发布的值以重新显示表单。如果找不到值,他们将从模型对象中获取该值。要防止这种情况,您可以做的是清除 ModelState 在执行 return :

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

    但是,这将清除未传递回视图的任何用户输入数据的形式,并且还将清除任何验证消息。看见 https://msdn.microsoft.com/en-us/library/system.web.mvc.modelstatedictionary.aspx 有关ModelState的更多信息。

        2
  •  2
  •   Sentinel    6 年前

    实际上,HtmlHelper不使用Model,而是使用ModelState。可以通过避免使用html助手并直接使用model字段来解决此问题。