ViewModel 绑定工作,传回编辑控制器的对象包含正确的值,这是一个选定选项的列表。但是,ModelState 绑定不起作用,模型状态 AttemptedValues 存在,但没有被重新加载到字段中。
我有一个具有以下属性的模型
class Model
{
public List<string> AvailableValues { get; set; }
public List<string> SelectedValues { get; set; }
}
但在我看来,我有一些分类,所以我不能直接进行 foreach。
foreach (var category in CatgoryList.Categories)
{
foreach (var available in Model.AvailableValues.Where(x => category.AvailableValues.Contains(x))
{
var check = Model.SelectedValues!= null && Model.SelectedValues.Contains(available.Id);
check &= (ViewData.ModelState["SelectedValues"] != null) && ViewData.ModelState["SelectedValues"].Value.AttemptedValue.Contains(available.Id);
<input type="checkbox" name="SelectedValues" id="available.Id" value="available.Id" checked="@check"/>@available.FriendlyName<br>
}
}
ModelState 确实包含上一篇文章中的 SelectedValues,但它不会自动绑定,因为我有一个用于复选框的自定义字段。
这段代码很臭
有没有更好的方法来从尝试值加载数据
编辑:
好的,所以我的问题不够清楚,让我澄清一下。
在验证时,如果出现错误,我将重新调整相同的视图。modelstate 保存先前在 ModelState["field"].Value.AttemptedValue 中输入的值。对于使用帮助器、TextboxFor、CheckboxFor 等创建的字段,这些值会自动填充。
但是,当使用普通反射进行复选框绑定时,只有选中复选框的值会在传递回控制器的数据对象中返回。这意味着我没有使用从 ModelState 中填充值的逻辑。
我所做的是自己挖掘模型状态以获取尝试的值,因为它们确实存在于字段名称“SelectedValues”下。但我必须手动应用它们。那里的值看起来像这样。
ModelState["SelectedValues"] = "Value1;Value2;Value4"
有没有更好的方法来从模型状态中的尝试值加载数据。