5

Linq-to-Sql に、データ注釈属性と xVal への参照でマークされた部分クラスを持つモデル クラスがあります。

ビューをモデルに直接バインドすると、xVal によって生成された JS とサーバー側の二重チェックの両方で、すべてがうまく機能します。

私のビューの多くは 1 つの特定のモデルへの入力を受け付けないため、ビュー モデル クラスを設定しています。モデル インスタンス全体を公開する代わりに、ビューで設定できる/必要なプロパティをモデルに公開します。

// foo model 
public class Foo {
    public string FooField { ... }
    public Bar Bar { ... }
}

// bar model, where bar is a parent relationship of foo in the db
public class Bar {
    public string BarField { ... }
}

// view model stuff
public class FooViewModel {
    private Foo foo;

    public FooViewModel() {
        foo = new Foo() { Bar = new Bar() };
    }

    public Foo Model {
        get { return foo; }
        set { foo = value; }
    }

    public string BarField { 
        get { return foo.Bar.BarField; }
        set { foo.Bar.BarField = value; }
    }

    public string ExtraViewModelField {
        get; set; 
    }
}

このアプローチはビュー モデル クラスを正しく設定し、リポジトリはレコードを正しく設定できます。

ただし、検証をまったく通過しません。発行されたクライアント コードを確認しましたが、xval の検証配列は空です。さらに、IsValid のサーバー側チェックは常に true です。

このように検証のためにビューモデルのプロパティを介してデータ注釈をプルさせることはできますか、それとも別の方法で行う必要がありますか?

4

3 に答える 3

4

パーシャルを使用し、サブタイプを渡す場合でも、資格を得る必要があります。次のように参照してください。

<%@ Control Language="C#" 
                   Inherits="System.Web.Mvc.ViewUserControl<MvcWeb.Models.OrderDetail>" %>

<% using (Html.BeginForm()) { %>

    <fieldset>
        <legend>Fields</legend>
            <%= Html.Hidden("OrderId", Model.OrderId) %>
            <%= Html.Hidden("ProductId", Model.ProductId)%>
        <p>
            <label for="Quantity">Quantity:</label>
            <%= Html.TextBox("OrderDetails.Quantity", Model.Quantity)%>
            <%= Html.ValidationMessage("OrderDetails.Quantity", "*") %>
        </p>
        <p>
            <input type="submit" value="Save" />
        </p>
    </fieldset>

<% } %>

タイプがOrderDetailsであることに注意してください。ただし、検証メッセージを処理するために、まだその前に付けています。

于 2009-11-19T13:07:39.727 に答える
0

これを正しく読んだら、linq to sql クラスに DataAnnotations を配置してから、ビューモデルのプロパティに linq to sql クラスのプロパティを入力します。

これを xval で動作させるには、ビュー モデル プロパティに DataAnnotations を配置する必要があります。xvalsコードからわかる限り、検証情報についてパブリックプロパティを超えて調べることはありません(ここで間違っている場合は誰かが私を修正してください)。

モデルとビューモデルの間で検証を透過的にしたい場合は、postsharp を使用して属性をバインドするルートをたどることができますが、プログラムが小さい場合、これはほとんど利益のない多くの作業になる可能性があります。

于 2009-11-19T13:32:59.023 に答える
0

xval ヘルパー コードと Html.Helpers の一部を投稿できますか?

エンティティとプレフィックスを使用するため、ビュー モデル内の構造によって違いが生じる理由がわかりません。何かのようなもの:

<%= Html.ClientSideValidation<Foo>("Foo") %>
<%= Html.ClientSideValidation<Bar>("Foo.Bar") %>

ジェームズ

于 2009-08-11T15:34:39.813 に答える