8

ユーザー入力に応じて動的にビュー モデルを生成する asp.net mvc 2 アプリケーションを作成しています。簡単に言えば、ユーザーはビューに表示するフィールドを選択できます。

テンプレート化されたヘルパーはモデルのプロパティと属性 (データ注釈) に大きく依存しているため、実行時にビュー モデルに何らかの方法で属性を追加する必要があります。これが簡単な作業ではないことは言うまでもありません。

では、このシナリオで何をすることをお勧めしますか? 属性を静的に追加することはできないので、たとえそれが大変な作業であっても、属性を動的に追加しようとするか、別のアプローチを使用する必要がありますか?

前もって感謝します!

フェリペ

4

3 に答える 3

3

カスタム モデル バインダーは、バインディング部分でのみ役立ちます。テンプレート化されたヘルパーや ASP.NET MVC のその他の機能には役立ちません。

ModelMetadataProviderから継承し、 ModelMetadataProviders を使用してglobal.asaxにプロバイダーを登録することで、代わりにカスタムメタデータプロバイダーを作成することをお勧めします。カスタム メタデータ プロバイダーは、必要な場所 (CLR 属性、XML ファイル、データベース、または乱数ジェネレーター) からメタデータを取得できます。もちろん、組み込みのデータ注釈プロバイダーは CLR 属性を使用します。

組み込みの Data Annotations メタデータ プロバイダーのソース コードを見て、プロバイダーの実装方法の例を確認することをお勧めします。ASP.NET MVC 2 RC 2 ソース コードは、CodePlex サイトからダウンロードできます。MVC Futures プロジェクトにも実装があるかもしれませんが、よくわかりません。

于 2010-02-13T02:39:10.407 に答える
0

(私が正しく理解していれば)やり過ぎのように聞こえます-それはその場でモデルを作成しています。モデルを持つことの主な利点を使用していません。コンパイル時チェック。

タスクに固有のオブジェクト(たとえば、UserFormFieldsクラスのリストなどを持つUserFormクラス)を手元で使用し、その場で作成しないようにします。

編集:私が提案しているのは、属性ベースの検証を使用せ、検証を念頭に置いてモデルを設計することです。以下のようなデザインは私のポイントをよりよく説明するかもしれません:

interface IUserValidation
{
    bool IsValid();
}

class RequiredUserValidation : IUserValidation
{
    public bool IsValid()
    {
        // ....
    }
}

class UserFormField
{
    List<IUserValidation> _validations;

    public IEnumerable<ValidationResult> Validate()
    {
       // ...
    }
}
于 2010-02-13T02:19:59.597 に答える
0

検証を動的に適用するカスタムビューモデルバインダーが必要になるようです。

于 2010-02-13T02:32:51.713 に答える