2016-04-05 5 views
0

私は検証とその動作方法について多くの研究を行っています。私は、属性を使用したり、ViewModelを介してそのデータを検証できるカスタム属性を作成することもできることを理解しています。これはうまくいきますが、複数のViewModelで同じ属性の組み合わせを再利用することができます。MVC5での検証属性の再利用

たとえば、プロジェクトXの名前であるMovie Name、Book Name、Person First Name、Last Nameなどの名前を取ることができます。私は同じ検証属性の90%を適用する傾向があります。必要最小限の長さ3、最大の長さ50、文字、スペースなど...あなたは画像を取得します。

ここでは、5つ以上の属性がスタックされた変数を使用します。これらはあらかじめ作成された属性なので、既にコード化されているので、再度コード化したくないということです。だから私の質問はこれです:

これらのすべてのものを検証し、何が間違っているかに基づいて異なるエラーメッセージを提供し、同時にいくつかの組み込み属性を再利用するCustomValidateName属性をどのように作成できますか? .NETフレームワークを使用して、ホイールを再発明しているわけではありません。一番下の行は、Name変数があるときはいつでも、通常の5+の代わりにこの属性を入れることができるということです。

+0

はプロパティとベースビューモデルを検討し、その検証は私が持っている –

+0

@StephenMuecke属性が、私は、私はお互いを拡張するオブジェクトのこれらの鎖を持っているでしょうし、悪夢をデバッグするだろうと感じてもらいます。それとも、私は、カップルのビューモデルで多くのものが使用されているが、すべてが複雑になり、デバッグするのが難しいものではない、1つの基本オブジェクトを持つだろう。私はカスタム属性を作成することが可能かどうか、その中に他の属性を参照して、その結果に基づいてカスタムエラーメッセージを提供したいかどうかを見たいと思っていました。 – Bojan

+0

いくつかの問題があります:1)バリデーションは、一般的には類似していますが、レイヤー間でもビュー間でも同じではありません。たとえば、InsertフォームはUpdateフォームよりもリラックスしています。 POST APIはInsertフォームの方が厳しくなりますが、実際にそれらを必要とするViewModelの5つの属性ではなく、1つのファイルで使用ポイント(シナリオごとに4〜5)を離れて15〜20の異なる設定を持つことになります。 2)コントロールとライブラリは、DataAnottation属性について知っています。あなたは多くの機能を複製する必要があります –

答えて

0

使用は、例えば、あなたのすべての検証

ためのカスタム検証を作成することができます。

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.ComponentModel.DataAnnotations; 
using System.Text.RegularExpressions; 

namespace Custom_DataAnnotation_Attribute.Models 
{ 
    public class CustomEmailValidator : ValidationAttribute 
    { 
     protected override ValidationResult IsValid(object value, ValidationContext validationContext) 
     { 
      if (value != null) 
      { 
       string email = value.ToString(); 

       if (Regex.IsMatch(email, @"[A-Za-z0-9._%+-][email protected][A-Za-z0-9.-]+\.[A-Za-z]{2,4}", RegexOptions.IgnoreCase)) 
       { 
        return ValidationResult.Success; 
       } 
       else 
       { 
        return new ValidationResult("Please Enter a Valid Email."); 
       } 
      } 
      else 
      { 
       return new ValidationResult("" + validationContext.DisplayName + " is required"); 
      } 
     } 

方法の上には、必要なNDメールタイプ

両方の検証を生成するあなたは使用して、この方法ではより多くの検証を追加することができます場合は、またはスイッチと回覧メッセージを元に戻す

モデル:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.ComponentModel.DataAnnotations; 

namespace Custom_DataAnnotation_Attribute.Models 
{ 
    public class EmployeeModel 
    { 
     public string Name { get; set; } 

     [CustomEmailValidator] 
     public string Email { get; set; } 
     public string Password { get; set; } 
     public string Mobile { get; set; }   
    } 
} 
+0

これは、OPが尋ねたものではありません –

+0

ありがとう応答。正規表現がマッチしていると言うコード行が見えますか?この確認は属性 '[EmailAddress(ErrorMessage =" Invalid Email Address ")]を置くことで既に達成できます。この時点で、それはホイールを再発明しています。私は、そのカストム属性内に私の上記の行のコードを再利用しようとしている、私はすでに存在する場合、独自の検証を書く必要はありません。もう1つの問題は、あなたが1つのエラーだけを返した方法を見ていますか?私はむしろそれをすべて検証し、ユーザーにすべてのエラーを返すので、彼は5回提出することはありません。 – Bojan

関連する問題