2012-08-17 190 views
5

因此,我試圖在控制器中獲取模型對象的密鑰,以便我可以向其添加AddModelError獲取控制器中強類型模型的「密鑰」

在我看來,我用

@Html.ValidationMessageFor(model => model.Email) 

請告訴我相當於代碼來獲取Key名在控制器添加所以它重視這個ValidationMessage。

回答

2
ModelState.AddModelError("Email", "the email is invalid"); 

但通常這不是你應該在你的控制器手動做的事情,但你應該使用驗證器。例如,您可以用一些驗證數據註釋屬性修飾這個Email屬性,或者如果您像我一樣使用FluentValidation.NET =>這樣您不應該問自己關於鍵的問題,而是關注實際的驗證邏輯。

+0

密鑰總是會成爲名字嗎?我認爲這是生成的,所以並不總是保證是對象名稱? – 2012-08-17 17:43:13

+0

它將永遠是一樣的。 – 2012-08-17 17:44:11

+0

它始終等於字段名稱。只是要小心,因爲如果你重命名字段(即使使用ReSharper),它也不會更新這個字符串,因爲它們只是巧合匹配。幸運的是,我相信使用未知密鑰不會產生任何負面影響(比如讓頁面拋出異常),它相當於使用'null'。 – 2012-08-17 17:47:51

17

您可以使用不一樣的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源代碼中,他們做了一些額外的消毒處理,但使用正常名稱不應該成爲問題。

+2

剛剛遇到了一個錯誤,使用它。如果該屬性是一個結構,則表達式看起來像Convert(property),因爲該表達式返回一個對象。在這種情況下,表達式文本評估爲空字符串。我建議將函數更改爲public static void AddModelError (此ModelStateDictionary字典,Expression >表達式,字符串errorMessage)並將其調用爲ModelState.AddModelError((TModel i)=> i。 Person.Name,「test」) – Sven 2015-01-09 10:15:26