【问题标题】:How to generate field names for model state dictionary?如何为模型状态字典生成字段名称?
【发布时间】:2011-08-25 14:34:54
【问题描述】:

新的辅助方法 EditorFor、TextBoxFor 在避免视图中的硬编码字段名称方面非常酷。

我正在编写验证函数,其中服务验证复杂的模型数据。 如果某个字段出现错误,服务应将此字段的错误推送到模型状态字典中。

是否有生成完整模型名称的辅助方法?

编辑:
样本模型:

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");

如果一个属性被重命名,如果我没有像单元测试这样的其他检查,则没有反馈。 我想写:

ModelState.AddModelErrorFor(
  m => m.InnerModel.SomethingMoreToValidate[0].A, 
  "There is a problem with this field")

【问题讨论】:

  • 完整的型号名称是什么意思?

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


【解决方案1】:

您可以使用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");

话虽如此,您显然应该在正确编写的应用程序中进行单元测试。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-13
    • 2013-01-28
    • 1970-01-01
    • 2013-05-12
    • 2011-01-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多