2010-09-10 89 views
1

MVC的一個優點是可以在普通Web調用以及Ajax調用中使用Actions。但是這樣做對我的代碼有點不舒服。我想知道別人的想法。如何在ASP.Net中處理對控制器的Ajax調用MVC

所以我想查看列表中項目的詳細信息。我創建了一個Details視圖。我也決定使用hijaxing - 如果用戶啓用了Javascript,我希望Details窗體是一個彈出窗口。所以對於Details.aspx,我需要完整的html,但如果它是ajax請求,我只需要表單元素。因此,這裏是我怎麼寫我控制器的方法:

public ActionResult Details(int id) 
{ 
    if (Request.IsAjaxRequest()) 
    { 
     return PartialView(GetAjaxModel()); 
    } 
    else 
     return View(GetModel()); 
} 

它的工作原理,但每當我有一個巨大的「if」語句是圍繞我的整個代碼,它困擾着我。我怎樣才能擺脫這個問題和/或讓代碼更好?

我也可以寫稱爲AjaxDetails一個單獨的方法,但我真的很想寫的是:

public ActionResult Details(int id) 
{ 
     return View(GetModel()); 
} 

[Ajax] 
public ActionResult Details(int id) 
{ 
    return View(GetAjaxModel()); 
}  

但是據我所知,沒有屬性篩選阿賈克斯VS正常通話。

如何編寫Ajax調用?

UPDATE Clicktricity的確的確有正確的答案。一個額外的變化,不過是,自2控制器方法不能有相同的簽名,我需要寫控制器代碼這樣:

public ActionResult Details(int id) 
{ 
     return View(GetModel()); 
} 

[AjaxRequest] 
[ActionName("Details")] 
public ActionResult DetailsAjax(int id) 
{ 
    return PartialView(GetAjaxModel()); 
}  
+0

有趣的一點 – Clicktricity 2010-09-13 19:45:20

回答

3

你是正確的,沒有一個過濾器,這是否 - 但是以典型的MVC方式,沒有理由不寫你自己的。

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

然後,您可以在您的操作方法上使用[AjaxRequest]

(請注意,我沒有測試過這一點)

+0

+1的答案,和伴隨的警告! – 2010-09-11 19:40:46

相關問題