因此,我試圖在控制器中獲取模型對象的密鑰,以便我可以向其添加AddModelError
。獲取控制器中強類型模型的「密鑰」
在我看來,我用
@Html.ValidationMessageFor(model => model.Email)
請告訴我相當於代碼來獲取Key
名在控制器添加所以它重視這個ValidationMessage。
因此,我試圖在控制器中獲取模型對象的密鑰,以便我可以向其添加AddModelError
。獲取控制器中強類型模型的「密鑰」
在我看來,我用
@Html.ValidationMessageFor(model => model.Email)
請告訴我相當於代碼來獲取Key
名在控制器添加所以它重視這個ValidationMessage。
ModelState.AddModelError("Email", "the email is invalid");
但通常這不是你應該在你的控制器手動做的事情,但你應該使用驗證器。例如,您可以用一些驗證數據註釋屬性修飾這個Email屬性,或者如果您像我一樣使用FluentValidation.NET =>這樣您不應該問自己關於鍵的問題,而是關注實際的驗證邏輯。
您可以使用不一樣的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);
}
}
所以你可以使用它像這樣:
ModelState.AddModelError<TModel>(i => i.Person.Name, "test");
相當於
ModelState.AddModelError("Person.Name", "test");
它會生成與Html相同的Id。在MVC源代碼中,他們做了一些額外的消毒處理,但使用正常名稱不應該成爲問題。
剛剛遇到了一個錯誤,使用它。如果該屬性是一個結構,則表達式看起來像Convert(property),因爲該表達式返回一個對象。在這種情況下,表達式文本評估爲空字符串。我建議將函數更改爲public static void AddModelError
密鑰總是會成爲名字嗎?我認爲這是生成的,所以並不總是保證是對象名稱? – 2012-08-17 17:43:13
它將永遠是一樣的。 – 2012-08-17 17:44:11
它始終等於字段名稱。只是要小心,因爲如果你重命名字段(即使使用ReSharper),它也不會更新這個字符串,因爲它們只是巧合匹配。幸運的是,我相信使用未知密鑰不會產生任何負面影響(比如讓頁面拋出異常),它相當於使用'null'。 – 2012-08-17 17:47:51