2012-01-15 67 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 
} 

有沒有辦法做到上面的代碼更簡單的方法?也許使用自定義的viewresult,它會檢查,如果請求是AJAX,並返回正確的視圖。或者也許是某種基本控制器?我不知道如何實施這兩個想法,所以任何指導都會很棒。

回答

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; 
     } 
    } 
} 

現在你可以裝飾你的控制器或動作與此屬性。

如果您正在使用Razor視圖引擎的另一種可能性是調整你的_ViewStart.cshtml文件,該文件是在佈局定義:

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