0

数日前にこの質問の背景を投稿しました..しかし、答えはまだ不完全であるため、要約を付けて再投稿します。

オブジェクトの複数のカテゴリの詳細が格納されている MVC 3 Razor Web アプリを開発しています。(車両、住宅、楽器など) . すべてのオブジェクトは、いくつかの共通データ (タイトル、説明など) と、それが属するカテゴリに固有の詳細を共有します。カテゴリ リストは拡大することが予想され、保守性を低下させることを考慮して、同じ [オブジェクトの追加] ウィザードを再利用したいと考えています。ウィザードは、次の実装に基づいています。

http://afana.me/post/create-wizard-in-aspnet-mvc-3.aspx

複数ステップのウィザード プロセスでは、最後のステップで、ユーザーはカテゴリ固有の詳細 (車両のモデル、メーカー、VIN など) を入力できます。ビュー ページは、次のように定義される「AssetView」モデルにバインドされます。

public class AssetView
{
    [Required]      
    public string Title { get; set;  }

    [Required]
    public string Description { get; set;}

    public SpecificAsset AssetDetails { get; set; }
}

AssetDetails プロパティは、前の段階で選択されたカテゴリ タイプに従って実行時に動的に変更されます。ビューは次のようになります

@model AssetView
....
<div class="wizard-step">
  ...
 </div>
<div class="wizard-step">
  ...
 </div>
<div class="wizard-step">
  @Html.EditorFor(model => model.AssetDetails)
 </div>

コントローラで、カテゴリの選択に基づいて。次のようにアセットの詳細を初期化します

_thisAsset.AssetDetails = new MotorAsset();

次に、タイプ固有のエディター テンプレートでビューをオーバーライドします。

ウィザードは正常に動作しますが、コントローラーの保存ステップで、「AssetDetails」プロパティに値がなく、基本タイプである「SpecificAsset」タイプであることが示されます。特定のタイプにもキャストできません。ただし、formsCollection にはすべての値が表示されます。「Transmission」、「Make」などの「AssetDetails」固有のプロパティは、「AssetDetails_」で始まるフォーム コレクションにあります。

コントローラーの保存ステップで 20 種類以上の特定のカテゴリ (モーター、ハウスなど) を処理する必要があることを念頭に置いて、何らかのハックなしでこれを行うにはどうすればよいですか?

4

2 に答える 2

0

AssetDetailsのタイプがわかっている場合は、次のように実行できます。

  1. AssetViewをアクションのパラメーターとして使用します(共通のプロパティをバインドします)
  2. 特定のAssetDetails(CarDetailsなど)の新しいインスタンスを作成します
  3. TryUpdateModelのオーバーロードの1つを使用して、値をバインドします。プレフィックスを指定できるオーバーロードがいくつかあるため、常に機能するはずです
  4. このオブジェクトをAssetView.SpecificAssetに追加します

特定のタイプを知るための何らかの方法が必要です。しかし、タイプを追跡する変数があるので、後で適切に保存できると思います。そうでない場合は、簡単に追加できます。ただし、AssetDetailsはバインドされていないため、AssetViewである必要があることに注意してください。

検証が必要な場合は、TryValidateModelも試すことができます。

于 2011-02-01T06:15:28.193 に答える
0

私が理解しているように、モデルの数が増え、すべてのモデルでアクションとビューを再利用したいと考えています。私が見る 1 つのオプションは、カスタム ModelBinder を作成することです。FormCollection を調べてから、特定のアセット モデルを作成します。

ソリューションの問題は、SpecificAsset にプロパティがないため、デフォルトのモデル バインダーがフィールドをバインドしないことです。

于 2011-02-01T07:04:37.247 に答える