0

ハイジャックを使用して、mvc を使用して単一ページの Web アプリケーションを実行しようとしています。私が見つけた問題は、コントローラーが返すレイアウトを効率的に切り替える方法です。

最も明白な非効率的な解決策は、すべてのコントローラーでこのコードを使用することです。

if (Request.IsAjaxRequest())
{
    return PartialView();
}
else
{
    viewdata["controller"]= "x"; viewdata["action"]= "y"; 
    return View("defaultview"); //I need view data because only one template main
                                //view is returned and based on the viewdata the main 
                                //view loads the right partial view inside it
}

上記のコードをより簡単な方法で実行する方法はありますか? おそらく、リクエストがAJAXであるかどうかをチェックし、適切なビューを返すカスタムviewresultを使用します。それとも、ある種のベースコントローラーですか?両方のアイデアを実装する方法がわからないので、ガイダンスは素晴らしいでしょう。

4

1 に答える 1

2

OnActionExecuted1つの可能性は、カスタムアクションフィルターを作成し、イベントをサブスクライブすることです。内部では、アクションがAJAXリクエストを使用して呼び出されたかどうか、およびビュー結果が返されたかどうかを確認します。この場合、このビュー結果を部分ビュー結果に置き換えます。

public class LayoutSelectorAttribute : ActionFilterAttribute
{
    public override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        var result = filterContext.Result as ViewResult;
        if (filterContext.HttpContext.Request.IsAjaxRequest() && result != null)
        {
            var partialViewResult = new PartialViewResult
            {
                ViewName = result.ViewName,
                ViewData = result.ViewData,
                TempData = result.TempData
            };
            filterContext.Result = partialViewResult;
        }
    }
}

これで、コントローラーまたはアクションをこの属性で装飾できます。

Razorビューエンジンを使用している場合、別の可能性は_ViewStart.cshtml、レイアウトが定義されているファイルを微調整することです。

@{
    Layout = !ViewContext.HttpContext.Request.IsAjaxRequest() 
        ? "~/Views/Shared/_Layout.cshtml" 
        : null;
}
于 2012-01-16T07:10:07.153 に答える