获取控制器中强类型模型的"密钥"

Joh*_*ell 5 c# asp.net-mvc

所以我试图在控制器中获取模型对象的密钥,以便我可以添加一个AddModelError.

在我看来,我用

@Html.ValidationMessageFor(model => model.Email)
Run Code Online (Sandbox Code Playgroud)

什么是等效的代码来获取Key在控制器中添加的名称,以便它附加到此ValidationMessage.

Joh*_*eer 20

您可以使用与HtmlHelpers相同的扩展名,这将适用于嵌套属性:

public static class ModelStateExtensions
{
  public static void AddModelError<TModel>(this ModelStateDictionary dictionary, Expression<Func<TModel, object>> expression, string errorMessage)
  {
    dictionary.AddModelError(ExpressionHelper.GetExpressionText(expression), errorMessage);
  }
}
Run Code Online (Sandbox Code Playgroud)

所以你可以像这样使用它:

ModelState.AddModelError<TModel>(i => i.Person.Name, "test");
Run Code Online (Sandbox Code Playgroud)

相当于

ModelState.AddModelError("Person.Name", "test");
Run Code Online (Sandbox Code Playgroud)

它将生成与Html相同的Id.在MVC源代码中,他们会进行一些额外的清理,但使用正常的名称不应该是一个问题.

  • 刚刚遇到错误.如果属性是结构,而表达式看起来像Convert(property),因为表达式返回一个对象.在这种情况下,表达式文本计算为空字符串.我建议将函数更改为public static void AddModelError <TModel,TValue>(此ModelStateDictionary字典,Expression <Func <TModel,TValue >>表达式,字符串errorMessage)并将其调用为ModelState.AddModelError((TModel i)=> i. Person.Name,"test") (3认同)

Dar*_*rov 3

ModelState.AddModelError("Email", "the email is invalid");
Run Code Online (Sandbox Code Playgroud)

但通常这不是您应该在控制器中手动执行的操作,而是应该使用验证器。例如,您可以使用一些验证数据注释属性来装饰此 Email 属性,或者如果您像我一样使用FluentValidation.NET =>,这样您就不应该问自己有关键的问题,而应该关注实际的验证逻辑。