2014-02-15 58 views
0

我對在MVC中使用Ajax的正確方法有點困惑。假設我有一個返回相同視圖和相同模型的動作。唯一的問題是如果它是一個Ajax調用,我需要重新排列視圖的佈局。我發現解決方案要麼是我可以在MVC Action中確定它,並且返回相應的視圖,否則我可以轉到我的視圖並相應地使用@if(IsAjax)和佈局項目。如果你正在做Ajax,你應該做兩個單獨的操作還是做單獨的視圖?

@model MyModels.SomeModel 
@if (!IsAjax) 
{ 
arrange this way..... 
} 
else 
{ 
arrange another way... 
} 

[AllowAnonymous] 
public ActionResult Details(int? id) 
{ 
    ///get the SomeModel via some code here 
    if (!Request.IsAjaxRequest()) 
    { 
    return View2(someModel) 
    } 
    return View1(someModel) 
    } 
+2

一種主觀問題,但我認爲這不是視圖的責任,要知道請求是否是AJAX請求。我會在控制器動作中執行這個邏輯。 –

回答

2

確定請求是否爲AJAX請求應由控制器負責。現在,是否要創建一個單獨的操作方法來處理AJAX請求取決於您,但我認爲這是更清晰的方法。我會解釋我在項目中如何處理它。

首先,創建一個自定義屬性來標記要處理AJAX請求的動作方法。

public class AjaxOnlyAttribute : ActionMethodSelectorAttribute 
{ 
    public override bool IsValidForRequest(ControllerContext controllerContext, MethodInfo methodInfo) 
    { 
     return controllerContext.HttpContext.Request.IsAjaxRequest(); 
    } 
} 

現在您的控制器可以擁有單獨的操作方法,一個用於處理AJAX請求,另一個用於處理正常請求。

[AllowAnonymous] 
public ActionResult Details(int? id) 
{ 
    // Handle the normal request 

    return View(model); 
} 

[ActionName("Details")] 
[AllowAnonymous] 
[AjaxOnly] 
public ActionResult DetailsAjax(int? id) 
{ 
    // Handle the AJAX request 

    return PartialView("PartialViewForAJAX", model); 
} 

請注意,您必須重命名AJAX操作方法,因爲您不能擁有兩個具有相同名稱的操作方法。使用[ActionName("Details")]屬性標記此操作方法可確保此方法將處理對Details操作方法的所有AJAX請求。

這是我發現分離AJAX請求的控制器和視圖標記最清潔的方式。它不僅可以讓代碼在控制器中保持獨立,還可以確保您的視圖不會因AJAX請求的單獨標記而變得混亂。

+0

當我嘗試這樣做時,我得到_「當前的操作請求'DeletePost'...在以下操作方法之間是不明確的:DeletePostAjax()/ DeletePost()」_儘管它們的方法名稱不同。看起來他們仍然需要不同的HttpVerbs才能共存。 – Wiseguy

相關問題