4

ASP.Net MVC 4 のビューでモデルとして使用されるクラス内に (プロパティ レベルで) データ ドメインのアイデアを実装する方法はありますか?

次のコードを検討してください。

public class LoginProfileModel {

    [DisplayName("Login ID")]
    [Required(ErrorMessage = "Login ID is required.")]
    public string LogonID { get; set; }

    [DisplayName("Password")]
    [Required(ErrorMessage = "Password cannot be blank.")]
    [StringLength(20, MinimumLength = 3)]
    [DataType(DataType.Password)]
    public string Password { get; set; }
}

ASP.Net MVC 4 の LoginProfileModel を次に示します。さまざまなメタデータ/データ注釈を使用して、このコードでクリーンなビューを作成できるようにします。

@model myWebSite.Areas.People.Models.LoginProfileModel

@using ( Html.BeginForm( "Index" , "Login" ) ) {
    @Html.ValidationSummary()
    @Html.EditorForModel()
    <input type="submit" value="Login" />
}

私は「ログイン ID」と「パスワード」の考え方を複数のビューで使用しているため、複数のビュー モデルで使用しています。パスワードが使用する属性を定義したり、パスワード自体をすべてのデータ注釈とともに 1 つの場所に定義したりして、使用するたびに再指定するのではなく、必要に応じてすべての定義を再利用できるようにしたいと考えています。

    [DisplayName("Password")]
    [Required(ErrorMessage = "Password cannot be blank.")]
    [StringLength(20, MinimumLength = 3)]
    [DataType(DataType.Password)]
    public string Password { get; set; }

それは何らかの方法で可能ですか?

4

3 に答える 3

3

次の属性は、ビューの検証プロセスに影響します。

[Required(ErrorMessage = "Password cannot be blank.")]
[StringLength(20, MinimumLength = 3)]

検証属性については、次のようなクラスを作成できます。

public class PasswordRuleAttribute : ValidationAttribute
    {    
        public override bool IsValid(object value)
        {

            if (new RequiredAttribute { ErrorMessage = "Password cannot be blank." }.IsValid(value) && new StringLengthAttribute(20) { MinimumLength=3 }.IsValid(value) )
                return true;

            return false;
        }
    }

次のように使用できます。

[PasswordRule]
public string Password{get;set;}

あなたが言及した他の2つの属性は、クラスから直接派生したものでAttributeあり、それらを単一の属性に統合する方法はないと思います。

近いうちに編集で更新します。

したがって、次のものが残ります。

[DisplayName("Password")]
[DataType(DataType.Password)]
[PasswordRule]
public string Password{get;set;}

編集:

この投稿によると: Composite Attribute、属性をマージすることはできません。

于 2013-11-02T19:43:34.207 に答える
1

これは、ビュー モデルのメタデータを提供するバディ クラスを使用して行うことができます。そのようです:

public partial class LogonMetaData
{
    [DisplayName("Login ID")]
    [Required(ErrorMessage = "Login ID is required.")]
    public string LogonID { get; set; }

    [DisplayName("Password")]
    [Required(ErrorMessage = "Password cannot be blank.")]
    [StringLength(20, MinimumLength = 3)]
    [DataType(DataType.Password)]
    public string Password { get; set; }
}

次に、ビュー モデル:

using System.ComponentModel.DataAnnotations;

[MetadataType(typeof(LogonMetaData))]
public partial class FirstViewModel
{
    public string LogonID { get; set; }
    public string Password { get; set; }
}

using System.ComponentModel.DataAnnotations;

[MetadataType(typeof(LogonMetaData))]
public partial class SecondViewModel
{
    public string LogonID { get; set; }
    public string Password { get; set; }
}

partialクラス定義での の使用に注意してください。これが、このアプローチが機能する理由です。DRY の明らかな問題以外の 1 つの注意点は、メタデータ クラスがビュー モデルと同じ名前空間に存在する必要があることです。それ以外は、これはあなたが望むことをするはずです。

于 2013-11-02T20:21:23.007 に答える
0

John Hの答えの当然の結果として、継承を使用して、「LogonIdとパスワードのアイデア」を持つビューモデルをその基本ビューモデルから継承させることができます。これにより、前の回答で言及されたメタデータの問題が解決されます。

      public class LoginProfileModel {

        [DisplayName("Login ID")]
        [Required(ErrorMessage = "Login ID is required.")]
        public string LogonID { get; set; }

        [DisplayName("Password")]
        [Required(ErrorMessage = "Password cannot be blank.")]
        [StringLength(20, MinimumLength = 3)]
        [DataType(DataType.Password)]
        public string Password { get; set; }
    }

    public SomeOtherClassThatNeedsLoginInfo : LoginProfileModel{

         public string Property {get;set;}
}

SomeOtherClassThatNeedsLoginInfo で、これらのプロパティと関連する DataAnnotations を利用できるようになります。

もう 1 つのアイデアは、その LoginInfo を他のビュー モデルのプロパティとして渡すことです。

public SomeOtherClassThatNeedsLoginInfo{

             public string Property {get;set;}

             public LoginProfileModel LoginModel {get;set;}
    }
于 2013-11-03T23:47:06.460 に答える