ASP.NET MVC でコンテンツ ボックス データを再利用できますか?
-
05-07-2019 - |
質問
ヘッダー、画像、コンテンツを保持するボックスの PartialView を作成する場合、データベースを使用せずにコンテンツを保存する最良の方法は何ですか?
例: ターボタックス
サイドバーのボックスのコンテンツがデータベースに保存されているとは思えませんが、再利用可能なコードを作成するには、PartialView で構造を作成し、コンテンツ領域を設定するのが有益でしょう。PartialView を作成し、親コントローラーから PartialView にモデルを渡すことはできますが、別のページで同じボックスを使用したい場合は、同じコンテンツをコピーして貼り付ける必要があります。
解決
固定コンテンツの場合は、ファイル システム内で XML+XSLT または HTML スニペットを使用し、単純にレンダリングすることを検討するとよいでしょう。これには、部分ビュー (Html.RenderXml() または Html.Include()) よりも HtmlHelper メソッドの方が適しています。これらのビューと部分ビューの唯一の実際の違いは、置換がないためビュー エンジンが呼び出されないことです。私はプライバシーポリシーと利用規約でこのようなことをしています。これらをキャッシュしておくことをぜひ検討したいと思います。
これらが実際にテンプレートであり、コンテンツを置き換えているだけである場合、部分ビューはうまく機能すると思います。また、パフォーマンスが低下していることが判明した場合は、キャッシュを使用して、データをデータベースに保存することを検討します。これを前者と組み合わせて使用することもできます。たとえば、images/xml をファイル システムに保持し、それらへのポインタをデータベースに保持して、部分的にどれを選択すればよいかを知ることができます。
他のヒント
多くの場所で使用される部分ビューへのデータの受け渡しは、さまざまな方法で実行できます。
すべてのモデルのベースモデルクラスを作成します。基本クラスで、部分ビューのモデルを保持するPartialModelプロパティを定義します(使用する部分ビューが多い場合は、多くのモデルがある場合があります)。これで、コントローラーアクションでPartialModelプロパティを設定できますが、コードを再利用しやすくするために、アクションメソッドが実行された直後(ただし、モデルがビューに渡される前)に部分ビューデータを挿入する独自のアクションフィルターを作成できます
public class PartialViewModelAttribute : ActionFilterAttribute
{
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
BaseViewModel model;
if (filterContext.Controller.ViewData.Model == null)
{
model = new BaseViewModel();
filterContext.Controller.ViewData.Model = model;
}
else
{
model = filterContext.Controller.ViewData.Model as BaseViewModel;
}
model.PartialModel = new PartialModel(...) // Partial model initialization
base.OnActionExecuted(filterContext);
}
}
その後、次のように使用できます:
[PartialViewModel]
public ActionResult Index()
{
//...
}
別のオプション:すべてのコントローラーのBaseControllerクラスを作成し、ベースコントローラーの初期化時にPartialModelを作成できます。その後、PartialModelをViewData []辞書に格納できます。ビューでViewDataディクショナリを使用するのは悪いため、HtmlHelperで次のような拡張メソッドを作成します。
public static PartialModel GetPartialModel(this HtmlHelper helper)
{
return helper.viewContext.ViewData["PartialModel"] as PartialModel
}
したがって、この方法でモデルを取得できます。
<% Html.RenderPartial("MyPartial", Html.GetPartialModel()); %>