新的辅助方法EditorFor,TextBoxFor在避免视图中的硬编码字段名称方面非常酷。
我正在编写验证函数,其中服务验证复杂的模型数据。 如果字段存在错误,则服务应将此字段的错误推送到模型状态字典中。
是否有帮助方法生成完整的模型名称?
编辑:
SampleModel中:
class CustomModel {
public InnerModel Inner { get; set; }
}
class InnerModel {
public String Field1 { get; set; }
public SomethingMoreToValidate[] More { get; set; }
}
class SomethingMoreToValidate {
public int A { get; set; }
public int B { get; set; }
}
视图中InnerModel.SomethingMoreToValidate [0] .A的输入字段名称为“InnerModel.SomethingMoreToValidate [0] .A”。要将模型状态错误绑定到字段,我必须将带有此名称的错误放入ModelStateDictionary。
在显示InnerModel数据的视图中,我可以写:
Html.EditorFor(m => m.SomethingMoreToValidate[0].A);
如果重命名某个属性,编译器会发出警告。 在验证控制器或服务类中,我必须写:
ModelState.AddModelError(
"InnerModel.SomethingMoreToValidate[0].A",
"There is a problem with this field");
如果重命名了一个属性,如果我没有像unittests这样的其他检查,则没有反馈。 我想写一下:
ModelState.AddModelErrorFor(
m => m.InnerModel.SomethingMoreToValidate[0].A,
"There is a problem with this field")
答案 0 :(得分:7)
您可以使用GetExpressionText方法编写助手:
public static string GetExpressionText<TModel, TProperty>(Expression<Func<TModel, TProperty>> expression)
{
return ExpressionHelper.GetExpressionText(expression);
}
然后:
var expression = GetExpressionText<MyViewModel, string>(
x => x.InnerModel.SomethingMoreToValidate[0].A
);
ModelState.AddModelErrorFor(expression, "There is a problem with this field");
话虽如此,你应该在正确编写的应用程序中进行单元测试。