1

ASP.NET MVC アプリケーションでxValを使用していますが、これは一般的に優れています。Steve Sanderson のブログ投稿に従って、属性付きオブジェクトのサーバー側検証を行う DataAnnotationsValidationRunner を作成しました。これは、単純なクラスに最適です。例: 人:

public static class DataAnnotationsValidationRunner
{
    public static IEnumerable<ErrorInfo> GetErrors(object o)
    {
        return from prop in TypeDescriptor.GetProperties(o).Cast<PropertyDescriptor>()
               from attribute in prop.Attributes.OfType<ValidationAttribute>()
               where !attribute.IsValid(prop.GetValue(o))
               select new ErrorInfo(prop.Name, attribute.FormatErrorMessage(string.Empty), o);
    }
}

public class Person
{
    [Required(ErrorMessage="Please enter your first name")]
    public string FirstName { get; set; }

    [Required(ErrorMessage = "Please enter your last name")]
    public string LastName { get; set; }
}

ただし、この人に Address プロパティを追加し、Address クラスを DataAnnotation 属性でマークすると、それらは検証されません。例えば

public class Person
{
    [Required(ErrorMessage="Please enter your first name")]
    public string FirstName { get; set; }

    [Required(ErrorMessage = "Please enter your last name")]
    public string LastName { get; set; }

    public Address Address { get; set; }
}

public class Address 
{
    [Required(ErrorMessage="Please enter a street address")]
    public string Street { get; set; }

    public string StreetLine2 { get; set; }

    [Required(ErrorMessage = "Please enter your city")]
    public string City { get; set; }

    [Required(ErrorMessage = "Please enter your state")]
    public string State { get; set; }

    [Required(ErrorMessage = "Please enter your zip code")]
    public string Zip { get; set; }

    public string Country { get; set; }
}

1 つの問題は、DataAnnotationValidationRunner が複雑な子プロパティをたどらないことです。また、これらのエラーがエラー コレクションに追加された場合でも、モデルの状態に追加されたときに正しくプレフィックスを付ける必要があります。例えば。Person エラーは次のように追加されます。

    catch (RulesException ex)
    {
        ex.AddModelStateErrors(ModelState, "person");
    }

アドレス ルールの例外には、「person.address」というプレフィックスを付ける必要があると思います。xVal を使用して子オブジェクトの検証を処理するサポートされている方法はありますか?それとも、フラット化されたデータ転送オブジェクトを作成することが唯一の解決策でしょうか?

4

2 に答える 2

2

まず、Steve Sanderson の DataAnnotationsModelBinder と

最初の質問について (「DataAnnotationValidationRunner は複雑な子プロパティをたどりません」):

おそらく、Brad Wilson の DataAnnotationModelBinder を参照していますか? その場合、複雑な ViewModel を最後のプロパティまで検証する必要があります。そうでない場合は、使用している DataAnnoationsModelRunner の代わりにそれを使用してみてください。xVal を使用したクライアント側検証に関するこのブログ記事ブログ記事では、その方法を示しています。

DataAnnotationModelBinder の最初のバージョンには、複雑なビューモデルで使用するとクラッシュするバグがありました。おそらく、クラッシュを修正するが複雑なモデルを無視する新しいバージョンが出ているのでしょうか?

いずれにせよ、上記のリンク先のブログ記事のデモ プロジェクトで使用されている DataAnnotationModelBinder のバージョンを試してみることをお勧めします。私は自分の実世界のプロジェクトでそれを使用しており、複雑なビューモデルで機能します。

2番目の質問「xValで子オブジェクトの検証を処理するサポートされている方法はありますか」について:

ASPX フォームに存在するコードを投稿していませんが、 <%= Html.ClientSideValidation()%> はクライアント側の検証をそのモデル タイプの直接のプロパティに追加するだけで、プロパティには追加しないという事実にも言及している可能性があります。子オブジェクトの。複数の ClientSideValidation ステートメントを使用することで、問題を簡単に回避できます。次に例を示します。

<%= Html.ClientSideValidation<ModelType>()%>
<%= Html.ClientSideValidation<ChildModelType>("ChildModelPropertyName")%>
于 2009-09-03T09:29:04.367 に答える