ASP.NET MVCダイナミックビュー
-
27-10-2019 - |
質問
数日前にこの質問の背景を投稿しました。しかし、答えはまだ不完全であるため、要約で再投稿します。
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のタイプを知っている場合は、次のようにできます。
- アクションのパラメーターとしてAssetViewを取得します(共通のプロパティにバインドします)
- 特定のAssetDetailsの新しいインスタンスを作成します(たとえばCardetails)
- TryUpDateModelの過負荷の1つを使用して、値を結合します。プレフィックスを指定できる過負荷があるので、常に動作するはずです
- このオブジェクトをAssetView.specificAssetに追加します
特定のタイプを知るには何らかの方法が必要です。しかし、私はあなたがタイプを追跡する変数を持っているので、とにかく後で適切に保存できると思います。そうしないと、追加するのは簡単です。 AssetDetailsが拘束されていないため、AssetViewである必要があることを忘れないでください。
検証が必要な場合は、tryvalidatemodelがあります。試してみることもできます。
他のヒント
私が理解したように、モデルの数は成長し、すべてのモデルのアクションとビューを再利用したいと考えています。私が見るオプションの1つは、カスタムモデルバインダーを作成することです。フォームコレクションを調べ、特定の資産モデルを作成します。
ソリューションの問題は、specialAssetにプロパティがないため、デフォルトのモデルバインダーがフィールドのいずれにもバインドしないことです。