【发布时间】:2014-01-03 17:24:41
【问题描述】:
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"
有没有更好的方法来从模型状态下的尝试值加载数据。
【问题讨论】:
-
你认为
ModelState是什么?您在视图中使用它的方式没有意义。此外,诸如绑定之类的术语在 asp.net MVC 中具有非常特定的含义。没有 ViewModel 绑定之类的东西,“自动绑定”没有任何意义。 -
如果我的答案不清楚,请跟进,或者如果没问题,请接受作为答案
-
@GregEnnis 不,对不起。这没有帮助。
-
通常当有人发布“这段代码很臭”时,他们正在寻求如何改进它的建议。很抱歉我浪费了你的时间。祝你好运
标签: asp.net-mvc modelstate html.checkbox