【问题标题】:Why does this viewmodel value not render correctly?为什么这个 viewmodel 值不能正确渲染?
【发布时间】:2018-04-25 04:52:30
【问题描述】:

在我的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"> 

也就是说,它丢失了分配给DirBlocked 属性的true 值。这可能是什么原因造成的?通常,当我在 POST 操作中执行 return View(model) 时,所有模型属性都会按照设置正确呈现。

【问题讨论】:

  • 您要发布您的模型吗?我认为,model.DirBlocked 应该以 value = true 发回服务器,对吗?为什么需要将其重置为 true?
  • @Sarhang 为什么我将它设置为true 是因为如果发布的模型中的值等于另一个值,我需要重新显示视图并执行一些客户端代码。
  • 参考this answer了解行为

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


【解决方案1】:

当重新显示已发布的页面时,Html Helper 方法将首先查找已发布的值以重新显示表单。如果他们找不到值,他们将从模型对象中取而代之。你可以做些什么来防止这种情况是在做return之前清除ModelState

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

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

【讨论】:

    【解决方案2】:

    实际上 HtmlHelper 不使用 Model 而是使用 ModelState。您可以通过避免使用 html 帮助程序并直接使用模型字段来解决此问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-06
      • 1970-01-01
      • 1970-01-01
      • 2023-04-05
      • 1970-01-01
      • 1970-01-01
      • 2022-06-15
      • 2021-05-28
      相关资源
      最近更新 更多