首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何为模型状态字典生成字段名?

如何为模型状态字典生成字段名?
EN

Stack Overflow用户
提问于 2011-08-25 22:34:55
回答 1查看 1.5K关注 0票数 3

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

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

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

编辑:

样本模型:

代码语言:javascript
复制
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.A的输入字段的名称为"InnerModel.SomethingMoreToValidate.A“。要将模型状态错误绑定到字段,我必须将具有此名称的错误放入ModelStateDictionary中。

在显示InnerModel数据的视图中,我可以这样写:

代码语言:javascript
复制
Html.EditorFor(m => m.SomethingMoreToValidate[0].A);

如果属性被重命名,编译器会警告我。在验证控制器或服务类中,我必须写:

代码语言:javascript
复制
ModelState.AddModelError(
  "InnerModel.SomethingMoreToValidate[0].A", 
  "There is a problem with this field");

如果一个属性被重命名,如果我没有其他检查,比如unittest,就没有反馈。我想写下:

代码语言:javascript
复制
ModelState.AddModelErrorFor(
  m => m.InnerModel.SomethingMoreToValidate[0].A, 
  "There is a problem with this field")
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-08-26 17:08:51

您可以使用GetExpressionText方法编写一个帮助器:

代码语言:javascript
复制
public static string GetExpressionText<TModel, TProperty>(Expression<Func<TModel, TProperty>> expression)
{
    return ExpressionHelper.GetExpressionText(expression);
}

然后:

代码语言:javascript
复制
var expression = GetExpressionText<MyViewModel, string>(
    x => x.InnerModel.SomethingMoreToValidate[0].A
);

ModelState.AddModelErrorFor(expression, "There is a problem with this field");

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

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7192242

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档