ASP.NET MVCモデルは、複数の部分ビューに分割されます
-
27-10-2019 - |
質問
MVC 3 Razor Webアプリを開発しています。このアプリでは、オブジェクトの複数のカテゴリの詳細が保存されています。 (車両、家、楽器など)。すべてのオブジェクトは、いくつかの共通データ(タイトル、説明など)と、それが属するカテゴリに固有の詳細を共有します。カテゴリリストは成長することが期待されており、メンテナンス性を低下させることを考慮して、同じADDオブジェクトウィザードを再利用したいと考えています。ウィザードは、次の実装に基づいています。
http://afana.me/post/create-wizard-in-aspnet-mvc-3.aspx
複数のステップウィザードプロセスでは、最終ステップでは、ユーザーがカテゴリ固有の詳細(車両のモデル、メーカー、VINなど)を入力できます。現在、私はこの最後のステップをAjaxの部分的な見解として想像してきました。したがって、実際には、特定のカテゴリを反映するが、ウィザードコードの残りの部分を共有するmulltipleの部分的なビューを持っています。
私の一般的なモデルオブジェクトはこのようなものです
public class AssetView
{
[Required]
public string Title
{
get;
set;
}
[Required]
public string Description
{
get;
set;
}
// Few more generic fields here
public SpecificAsset AssetDetails { get; set; }
}
複雑なプロパティAssetDetailsは、各タイプの部分ビューで表されます。したがって、PartialView「Motordetails」には、以下のように宣言されているタイプのモーターセットの強く型付けされたモデルが含まれます。
public class MotorAsset : SpecificAsset
{
[Required]
public string Transmission
{
get;
set;
}
[Required]
public string Make
{
get;
set;
}
}
実際の検証ははるかに複雑ですが、これらを省略しているので、理解しやすいです。
メインウィザードページはとして宣言されています
@model AssetView
.....
<div class="wizard-step">
....
</div>
<div class="wizard-step">
....
</div>
<div class="wizard-step">
@{Html.RenderPartial("_MotorCreate", Model.AssetDetails);
</div>
モーター部分ビューとして
@model MotorAsset
私の質問は、最終ステップはビューページではなく部分的なビューにあるため、このシナリオでモデル検証を達成する(または使用することができる)ことです。
解決
AssetViewに不動産のAssetDetailを使用するのではなく、なぜ単純なクラスの相続(OOPパラダイム)に頼らないのですか?
あなたが今持っているものの代わりに、あなたはむしろ
AssetView(汎用プロパティ) - >モータービュー継承ASTETVIEW(特定のプロパティ)
このような:
public class AssetView {
[Required]
public string Title { get; set; }
[Required]
public string Description { get; set; }
// Few more generic fields here
}
public class MotorView : AssetView {
...
}
@model MotorView // you still have access to the AssetView's properties in your view and in your controller actions
あなたが今持っているようにそれを残したいなら、それを使用してください EditorFor()
そして、作成します EditorFor
共有フォルダーのテンプレートと強いタイプに MotorAsset
(また SpecificAsset
, 、さらに一般的なものが必要な場合)。
次に、次のようにレンダリングします。
@Html.EditorFor(model=>model.AssetDetails)
これにより、コントローラーはそれを検証し、あなたのプロパティに自動産生することができます AssetView
。 Hth