0

子モデル (VehicleModel) を保存するときに、親モデル (VehicleManufacturer) の特定のプロパティで Required フィールドの検証を「オフ」にしたいと思います。

public class VehicleManufacturer
{
    public virtual Guid Id { get; set; }

    [Required]
    [StringLength(50, MinimumLength = 1)]
    public virtual string Name { get; set; }
}

public class VehicleModel
{
    public virtual Guid Id { get; set; }

    [Required]
    [StringLength(50, MinimumLength = 1)]
    public virtual string Name { get; set; }

    public virtual VehicleManufacturer Manufacturer { get; set; }
}

そのため、新しいモデルを保存するときに気にするのは、ドロップダウン リストから選択される Name と ManufacturerID だけですが、ManufacturerName はエンティティで [Required] とマークされているため、ModelState が無効になります。 ManufacturerName が null であるため、新しい VehicleModel を保存するとき:(

これに対する最善のアプローチとその方法を知りたいです。いくつかの解決策を考えることができますが、どれも正しい方法ではないようです:

  • ModelState チェックの前に「デフォルト」の ManufacturerName 値を設定します。つまり、DataAnnotation を満たすためだけに「-」を設定します。
  • VehicleModelView に ManufacturerName と ManufacturerId の両方を入力します。親モデルに、子モデルで実際に使用する必要のない必須フィールドがたくさんある場合は良くありません
  • 子モデルの [必須] 検証をオフにします (方法がわからない?)

どう思いますか?

4

5 に答える 5

2

最も簡単な方法は、表示したくない必須プロパティの非表示フィールドを作成することです。

于 2012-04-19T09:56:21.280 に答える
1

考えられる解決策は、VehicleManufacturer (VehicleManufacturerId) への外部キー列を VehicleModel に追加し、その列をビューで使用することです。

于 2012-04-19T13:12:38.163 に答える
0

Ok。私はこれを見て、私の方法が無駄であることに気づきました。

これはどのように見えますか?

ExtendedValidationRequiredという注釈を作成しました。

拡張値の条件付きチェックをオンにするかどうかを決める静的な値があります。

[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Parameter, AllowMultiple = false)]

public class ExtendedValidationRequiredAttribute : RequiredAttribute
{



    // Summary:
    //     Initializes a new instance of the System.ComponentModel.DataAnnotations.RequiredAttribute
    //     class.
    public ExtendedValidationRequiredAttribute()
    {

    }



    // Summary:
    //     Checks that the value of the required data field is not empty.
    //
    // Parameters:
    //   value:
    //     The data field value to validate.
    //
    // Returns:
    //     true if validation is successful; otherwise, false.
    //
    // Exceptions:
    //   System.ComponentModel.DataAnnotations.ValidationException:
    //     The data field value was null.
    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        if (ExtendedValidation.IsExtendedValidationEnabled(validationContext.ObjectType))
        {

            return base.IsValid(value,validationContext);
        }
        else
        {
            return ValidationResult.Success;                
        }


    }




}

次に、[ExtendedValidationRequired(typeof(MyClassName))]を使用して、時々必要な(たとえば、そのクラスを直接編集する場合)フィールドをマークアップします。

これは、他のタイプのバリデーターでも機能します。

私は実際に先に進み、「Sometimes On」バリデーターのセットを作成し、設定を別のクラスに移動しました。public static class ExtendedValidation {private static Dictionary extendedValidationExemptions = new Dictionary();

    /// <summary>
    /// Disable extended validation for a specific type
    /// </summary>
    /// <param name="type"></param>
    public static void DisableExtendedValidation(Type type)
    {
        extendedValidationExemptions[type] = true;
    }
    /// <summary>
    /// Clear any EV exemptions
    /// </summary>
    public static void Reset()
    {
        extendedValidationExemptions.Clear();
    }

    /// <summary>
    /// Check if a class should perform extended validation
    /// </summary>
    /// <param name="type"></param>
    /// <returns></returns>
    public static bool IsExtendedValidationEnabled(Type type)
    {
        if (extendedValidationExemptions.ContainsKey(type))
        {
            return false;
        }
        else
        {
            return true;
        }
    }
}

}

子を編集するときにExtendedValidationをオフにするだけです。

EG:子を編集するとき、DisableExtendedValidation(typeof(Parent))を使用でき、邪魔になりません。

編集:うーん、これはうまくいかないことに気づきました。--validationProperty内で見ているクラスを特定できますか?私はいつでも親プロパティを渡すことができると思いますが、それはPITAです

于 2012-06-14T06:18:35.603 に答える
0

私がやったことは、 ParentWithExtendedValidation のようなもので親モデルをサブクラス化することです: Parent

ParentWithExtendedValidation では、さまざまな [必須] フィールドがすべてタグ付けされました。

親を具体的に編集したいときは、ParentWithExtendedValidation 型を使用しました。これは Parent のサブクラスであるため、モデルの検証に合格すると、問題なく親にキャストして DAL に渡すことができます。

これを参照する子を編集するなど、リレーションシップで使用する場合は、通常の Parent クラスを使用できます。

お役に立てれば

EG 私はクラス Person を持っています - 私の通常の仮想プロパティのすべてを持ち、ID だけが必要です (person->ID を選択する検証を正しく機能させるため)

そしてクラス PersonEV

public class PersonWithExtendedValidation : Person
{

    [Required]
    public override string FullName { get; set; }
    [Required]
    public override string FirstName { get; set; }
    [Required]
    public override string LastName { get; set; }        
    [Required]
    public override string DomainName { get; set; }
    [Required]
    public override string WorkPhone { get; set; }
    [Required]
    public override string CellPhone { get; set; }
    [Required]
    public override string Email { get; set; }        
}

次に、ビュー/コントローラーで、モデルと引数の PersonEV などを操作します。

ModelState.IsValid を確認したら、(Person) にキャスト バックし、通常どおりリポジトリなどに渡します。

于 2012-06-14T03:49:38.880 に答える
0

IValidatableObjectインターフェイスは、カスタム モデルの検証用です。

例えば:

public class VehicleModel : IValidatableObject
{
    public virtual Guid Id { get; set; }

    [StringLength(50, MinimumLength = 1)]
    public virtual string Name { get; set; }

    public virtual VehicleManufacturer Manufacturer { get; set; }

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
    {
        if(string.IsNullOrWhiteSpace(Name))
        {
           yield return new ValidationResult("Name is required")
        } 
    }
}

次に、コントローラー呼び出しでModelState.IsValid

于 2012-04-19T12:48:44.443 に答える