質問

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

MVC 3 Razor Webアプリを開発しています。このアプリでは、オブジェクトの複数のカテゴリの詳細が保存されています。 (車両、家、楽器など)。すべてのオブジェクトは、いくつかの共通データ(タイトル、説明など)と、それが属するカテゴリに固有の詳細を共有します。カテゴリリストは成長することが期待されており、メンテナンス性を低下させることを考慮して、同じADDオブジェクトウィザードを再利用したいと考えています。ウィザードは、次の実装に基づいています。

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>

カテゴリの選択に基づいて、コントローラーで。次のようにAssetDetailsをintializeします

_thisAsset.AssetDetails = new MotorAsset();

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

ウィザードは正常に動作しますが、コントローラーの保存ステップでは、「assetdetails」プロパティには値がなく、ベースタイプであるタイプの「expecisaset」であることが示されています。特定のタイプにもキャストすることはできません。ただし、FormScollectionにはすべての値が表示されます。「AssetDetails」「送信」、「Make」などの特定のプロパティは、「AssetDetails_」が付けられたフォームコレクションです。

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

役に立ちましたか?

解決

AssetDetailsのタイプを知っている場合は、次のようにできます。

  1. アクションのパラメーターとしてAssetViewを取得します(共通のプロパティにバインドします)
  2. 特定のAssetDetailsの新しいインスタンスを作成します(たとえばCardetails)
  3. TryUpDateModelの過負荷の1つを使用して、値を結合します。プレフィックスを指定できる過負荷があるので、常に動作するはずです
  4. このオブジェクトをAssetView.specificAssetに追加します

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

検証が必要な場合は、tryvalidatemodelがあります。試してみることもできます。

他のヒント

私が理解したように、モデルの数は成長し、すべてのモデルのアクションとビューを再利用したいと考えています。私が見るオプションの1つは、カスタムモデルバインダーを作成することです。フォームコレクションを調べ、特定の資産モデルを作成します。

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top