簡體   English   中英

使用Entity Framework時,處理ASP.NET MVC中的必填字段

[英]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;

但我可能錯了。

我知道它並不完全是你問的問題,但是,我上周完成了一個項目,其中我使用了MVC 3客戶端驗證和數據注釋以及不引人注目的javascript。 它非常滿口,但效果很好。 您可以設置regex,maxlenght,required和所有其他屬性,並在客戶端上驗證所有這些屬性。 這使得表單驗證對用戶來說更快。

這里有一些有用的鏈接示例, 這里這里和一個非常好的MSDN示例下載並在這里試用

希望能幫助到你,

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM