为何ViewModel中DirBlocked属性无法正确渲染为隐藏输入?
看起来你遇到了ASP.NET MVC中HiddenFor助手没有正确输出DirBlocked属性值的问题,我来帮你排查几个可能的原因和解决方案:
先确认模型值是否正确传递到视图
在视图里临时加一行@Model.DirBlocked,运行后看看页面上是否显示True。如果没有,那说明你的GET方法里模型赋值可能有问题——比如GetUserBaseDirAsync()有没有抛出异常导致后续代码没执行?或者模型实例化后有没有被其他代码覆盖了DirBlocked的值?移除
[HiddenInput]特性试试
你在ViewModel上同时用了[HiddenInput(DisplayValue = false)]和@Html.HiddenFor,这两个有时候会产生冲突。HiddenInput特性是用来告诉MVC的编辑器模板生成隐藏字段的,而HiddenFor本身就是专门生成隐藏输入的助手。去掉这个特性,只保留@Html.HiddenFor(m => m.DirBlocked),应该就能正确渲染出value="True"了。处理默认的必填验证(如果不需要的话)
你看到的data-val="true"和data-val-required是MVC默认给值类型(比如bool)添加的验证规则,因为bool不能为null,框架会自动认为它是必填项。如果不需要这个验证,可以把属性改成可空的bool类型:public bool? DirBlocked { get; set; }这样就不会自动生成必填验证属性,同时也能正常赋值
true并渲染到隐藏字段里。手动指定value(权宜之计)
如果上面的方法都不奏效,可以直接在HiddenFor里手动指定value:@Html.HiddenFor(m => m.DirBlocked, new { @value = Model.DirBlocked })这会强制把模型的当前值输出到input的value属性中。
你可以先从第一个步骤开始排查,确认模型值确实传到了视图,再一步步试后面的方案,应该能解决问题。
内容的提问来源于stack exchange,提问作者ProfK

