2012-01-15 8 views
0

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

最も明白な非効率的なソリューションは、すべてのコントローラ上でこのコードを使用することです:

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を使用します。それとも、ベースコントローラの何らかの並べ替えですか?私は両方のアイデアをどのように実装するかわからないので、どんな指針も素晴らしいでしょう。

答えて

2

カスタムアクションフィルタを作成し、OnActionExecutedイベントに登録することも可能です。内部では、アクションが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; 
     } 
    } 
} 

この属性でコントローラまたはアクションを飾ることができます。

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

@{ 
    Layout = !ViewContext.HttpContext.Request.IsAjaxRequest() 
     ? "~/Views/Shared/_Layout.cshtml" 
     : null; 
} 
関連する問題