[英]Handling required fields in ASP.NET MVC when using Entity Framework
好吧,這個問題真的在我的皮膚下。 讓我從一步一步的格式描述我的應用程序開始。
首先,我有我的Entity Framework生成的模型。 在其中我有以下實體:
http://www.codetunnel.com/EFEntities.jpg
現在,為了在實體上實現驗證,我使用了部分類並處理EF提供的OnChanging掛鈎。 以下是PostComment
部分類的示例:
namespace CodeTunnel.Domain.Models
{
public partial class PostComment : IDataErrorInfo
{
private Dictionary<string, string> _errors = new Dictionary<string, string>();
partial void OnAuthorChanging(string value)
{
//Validating anything but required value works fine.
//Like this pseudo-validator.
if (value.ToLower() != "fred")
_errors.Add("Author", "Sorry, your name must be Fred.");
}
partial void OnBodyChanging(string value)
{
//Required value validation does not work, I will tell you why below.
if (string.IsNullOrEmpty(value))
_errors.Add("Body", "Body is required.");
}
#region -= IDataErrorInfo methods =-
public string Error
{
get { return string.Empty; }
}
public string this[string columnName]
{
get
{
if (_errors.ContainsKey(columnName))
return _errors[columnName];
return string.Empty;
}
}
#endregion
}
}
請注意,我的類繼承自IDataErrorInfo
。 默認情況下,MVC會檢查此錯誤。 如果它找到任何,則它使模型無效並使用存儲的錯誤作為視圖中驗證助手的消息。 我很確定當EF拋出一個異常時,這個字典甚至永遠不會填充該屬性的值。 事實上,我甚至不確定MVC是否在EF生成異常后檢測並使模型無效時查找值。
這是問題的屏幕截圖,包括示例偽驗證器,因此您可以看到它正在工作:
http://www.codetunnel.com/ValidationError.jpg
如您所見,錯誤消息未顯示。 但是,它確實將該字段驗證為無效。 如果我在那里放一個值,那么它驗證就好了。 我已經對這個問題進行了很多研究,這就是我所知道的:
您無法自定義為必填字段顯示的錯誤消息的原因是因為model屬性不可為空。 因為它不可為空,所以嘗試將null值綁定到它會引發異常。 MVC吞下了這個例外,並使模型無效。 在發生此異常的任何地方都會生成消息。 我不知道消息是由EF還是MVC生成的(我猜MVC因為它首先負責吞噬異常)。 我不知道如何自定義此消息。 正如你所看到的,它總是說“價值'無效。” 我認為這並不完全可怕,但它真的不是非常用戶友好。
它到達我的名稱驗證器並檢查你的名字是否“fred”就好了,因為沒有拋出任何異常。 就EF而言,傳入的價值是可以的。 直到它進入我的OnAuthorChanging
方法,它才意識到它OnAuthorChanging
。 這是正確的行為,並且工作得很好。
如果我在OnChanging事件中拋出異常而不是添加到我的IDataErrorInfo
字典中,我可以生成相同的驗證消息,只有它將輸入的值放在單引號之間。 例:
partial void OnAuthorChanging(string value)
{
if (value.ToLower() != "fred")
//_errors.Add("Author", "Sorry, your name must be Fred.");
throw new Exception("Sorry, your name must be Fred.");
}
當輸入“test”作為Author的值時,該代碼顯示此消息:“值'test'無效。” 對於必填字段,它只是值為null,因此單引號之間沒有任何內容。
有些人( 比如這個人 )建議你只需在你的模型中將屬性設置為可空。 這不是一個可接受的解決方案。 其中一個原因是:
錯誤3031:從第313行開始映射片段的問題:不可為空的列PostComments.Body in Table PostComments映射到可空的實體屬性。
另外,設置nullable對於非可空類型(例如int)不起作用,將int切換為可空int是一個令人討厭的混亂,我甚至不會進入這里。
最重要的是,我想從EF自己處理這些例外,或者至少自定義它生成的消息,但我不知道如何。 我完全迷失了。 我想要做的就是根據我認為非常簡單的模型驗證定制一條消息!
任何幫助深表感謝。
正如您所發現的,MVC正在基於不可歸類型來驗證您的模型。 這是在自定義驗證運行之前向ModelState添加錯誤。
我之前有過這個,並通過在動作開始時循環通過Modelstate並刪除所有內容,然后進行自定義驗證(不好!!)來解決它
然后發現即使您沒有使用數據注釋作為主要驗證形式,您也可以通過添加[對buddy類中的非nullible類型是必需的,並指定消息來自定義拋出的消息。
它是這樣的:
[MetadataType(typeof(YourClassMetadata))]
public partial class YourClass
{
//buddyclass to entity class
class YourClassMetadata
{
[Required(ErrorMessage="Your custom overriding error message")]
public int NonNullablePropertyThatIsGivingYouProblems {get;set;}
}
}
我已經開始為mvc查看流暢的驗證( http://fluentvalidation.codeplex.com ),他們似乎通過添加行來關閉global.asax中的問題,在application_start()上
DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes = false;
但我可能錯了。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.