天天看點

一起談.NET技術,巨大轉變!ASP.NET MVC2調用AJAX新特征

  在ASP.NET MVC程式設計中使用AJAX功能是非常簡單的。借助于JQuery架構,你還可以增加其他的優秀特征并且使AJAX調用特别簡單。本文中,我們将探讨這方面的程式設計内容。

  一、檢測一個AJAX請求

  在Web表單中,建立AJAX請求典型的方法是使用一個更新面闆。當更新面闆回寄時,ScriptManager提供一個方法(通過其isInAsyncPostBack屬性)來檢測伺服器上的AJAX回寄。ASP.NET MVC也提供了類似的機制。因為AJAX能夠調用行為方法,是以我們需要一種方法來檢測一個請求是否是标準的GET/POST操作,還是一個AJAX請求。

  我們可以使用一個有用的擴充方法來實作上述檢測,這隻需調用Request.IsAjaxRequest()方法即可。我們知道,一個Web請求是一個針對HttpRequestBase(針對.NET架構HttpRequest對象的一個包裝器)的引用,它也是一個控制器的屬性。故而,我們可以使用IsAjaxRequest()方法來檢查請求資訊,以確定正在向伺服器發出一個AJAX請求。通過這種方式,我們可以正确地檢測出目前請求是一個ASP.NET請求還是一個jQuery請求。

  要實作上述這一點,隻需要在你的行為方法中添加下面的代碼。

  清單1—檢測一個AJAX請求 

if (Request.IsAjaxRequest())

//AJAX request

else

//Standard request

  為什麼檢測一個AJAX請求如此重要呢?因為根據行為方法所實作的任務我們處理AJAX請求的方式不同于标準的請求。我們很快會看到這樣的例子。

  二、使用Ajax表單

  微軟提供了一組AJAX擴充集,其中之一便是Ajax表單。通過此Ajax表單,可以向伺服器發出異步請求并提供相關的響應内容。用戶端所有的AJAX調用機制都包含在一個MicrosoftMVCAjax腳本内。清單2給出了一個簡單的Ajax表單示例。

  清單2:使用AJAX.BeginForm擴充  

<div id="customresponse"></div>

<% using (Ajax.BeginForm("AjaxCustom", new AjaxOptions

{ UpdateTargetId = "customresponse" })){%>

<div>

Name: <%= Html.TextBox("CustomName")%>

</div>

Value: <%= Html.TextBox("CustomValue")%>

<input type="submit" value="save" />

<%}%>

  上述AJAX表單處理回寄的細節,并使用JavaScript以異步方式執行,而不是執行一個到伺服器端的标準HTTP回寄。在清單2中,表單把資料回寄到AjaxCustom行為方法,并把表單的值傳遞過去,最後得到傳回的響應内容并以某種方式來使用這個結果。

  接下來,在行為方法中你可以使用非常現成的Request.IsAjaxRequest方法:

  清單3:處理可能的Ajax回寄并提供響應 

[HttpPost]

public ActionResult AjaxCustom(FormCollection post)

{

return Content("Success");

return RedirectToAction("Index");

}

  如果是一個AJAX請求,則把一個特殊的字元串傳遞回用戶端,并進行相應處理。這一行為是受AjaxOptions集合控制的。上面的清單2中把字元串“Success”注入到一個id為“customresponse”的HTML元素中。如果由于某種原因,該請求不是來自一個AJAX調用,行為方法仍可以正常工作—重定向到另一個視圖中。我們将在以後的文章中讨論這些情況。

  上面我隻是簡要地介紹了使用MS Ajax的情況,因為我相信最好的AJAX方案是當屬使用JQuery。

  三、使用JQuery

  jQuery功能非常強大,這種力量主要來自它的簡單性以及它能夠讓你完全控制整個過程。JQuery能夠通過簡單的幾行用戶端代碼就可以對一個MVC行為方法執行一個GET或POST操作。回調的結果直接傳遞給你手中,這意味着你可以全面控制響應操作,而且這一點是很容易做到的。在jQuery中,我們可以使用以下的形式把表單資料釋出到伺服器:

  清單4:回寄表單資料 

var form = $("#form1");

$.post(form.attr("action"), form.serialize(), function(data){

//Do something with data

});

  一個行為方法的響應可以是以下類型之一:

  • Content("Success")—以一個字元串方式傳回内容,然後你可以把它注入到HTML文檔中。

      • Json(new{ a = 1 })—傳回一個JSON對象。

      • View("Action")—以HTML字元串方式傳回一個視圖或部分視圖。

  上述這些選項都非常棒,因為jQuery能夠讓你從根本上進行資料控制,你可以使用這些資料來注入到使用者界面甚至完全取代UI内容。讓我們分析針對上述選擇的各個對應的例子。我構造了一個簡單的控制器,它能夠傳回上述每一種類型的内容。

  清單5:傳回上述每一種類型的内容示例

public class JQueryController : Controller

public ActionResult GettingContent()

return Content("This is my content");

public ActionResult GettingJson()

return Json(new { key = 1,value = "First" }, JsonRequestBehavior.AllowGet);

public ActionResult GettingPartial()

return PartialView("TestPartial");

public ActionResult Index()

return View();

  我們的用戶端會使用jQuery來使用上面定義的這些行為方法,每一個對應使用一個單獨的AJAX行為方法。在前面的JQuery調用中,執行了一個回寄,但我特意要求使用GET操作。一個GET和POST操作非常類似,除了POST傳遞的是一個序列值的集合之外。

  清單6:正在加載新資料 

<script type="text/javascript">

$(document).ready(function(){

$.getJSON('<%= Url.Action("GettingJson")%>', function(obj){

$('#jsoninject').html(obj.key.toString()+" = "+ obj.value.toString());

$.get('<%= Url.Action("GettingContent")%>', function(obj){

$('#contentinject').html(obj);

$('#partialinject').load('<%= Url.Action("GettingPartial")%>');

</script>

  這些方法中,get和load工作非常相似,它們都把内容直接加載到HTML元素中。其中,load方法能夠直接注入而不用回調,但get能夠使你更多地控制資料的處理。

  在文檔完全加載後,上述代碼将産生以下HTML輸出内容。  

<H1>Injecting JSON Object</H1>

<DIV id=jsoninject>1 = First</DIV>

<H1>Injecting Content</H1>

<DIV id=contentinject>This is my content</DIV>

<H1>Injecting Partial</H1>

<DIV id=partialinject>

<DIV>This is my partial view. </DIV></DIV>

  四、使用屬性控制請求

  當向伺服器送出請求時,一切有關請求的内容都被檢查(頭部、正文,等等)。這是由AJAX請求決定的。根據你的應用程式的複雜程度,你可能想建立單獨的行為方法,一個針對處理AJAX請求,另一個針對其餘的請求。是以,一個索引視圖可能會對應一個AjaxIndex行為方法來處理Ajax請求,而另外存在一個Index行為方法來處理其餘的請求。為此,我們可以利用過濾器屬性來確定調用正确的行為方法。

  下面給出的兩個類都使用了一個過濾器屬性,分别允許AJAX請求和标準的HTTP GET/POST請求。

  清單7:使用AJAX/标準請求過濾屬性 

public class AjaxOnlyRequestAttribute : ActionMethodSelectorAttribute

#region " Methods "

public override bool IsValidForRequest(ControllerContext

controllerContext, MethodInfo methodInfo)

return controllerContext.HttpContext.Request.IsAjaxRequest();

#endregion

public class StandardOnlyRequestAttribute : ActionMethodSelectorAttribute

return !controllerContext.HttpContext.Request.IsAjaxRequest();

  上面這些過濾器屬性屬于行為方法選擇器類型。這意味着,當MVC架構試圖比對一個到行為方法的請求時,它将執行如下過程:

  1.嘗試查找一個名字為Index的行為方法。

  2.是否查找完所有現有的規則?—是。

  3.檢查過濾器—隻存在一個Ajax過濾器。

  4.這是一個AJAX請求嗎?—不是。

  5.忽略此行為方法。

  如果在該過程結束時,不存在任何行為方法,則将從伺服器端傳回資源沒有發現的響應。

  五、小結

  在本文中,我們已經看到了MS AJAX和jQuery架構多種使用方法,而且了解到在MVC應用程式中使用AJAX支援是非常友善的。雖然這些功能也存在于Web表單架構下,但jQuery架構使你的MVC程式中實作AJAX調用更為容易。此外,自定義過濾器屬性可以幫助你确定每一個請求相應的行為方法,或者可以使用Request.IsAjaxRequest方法直接檢測請求類型。

【相關文章】: <a href="http://kb.cnblogs.com/page/73293/" target="_blank">巨大轉變!ASP.NET MVC2行為方法新改進</a> <a href="http://kb.cnblogs.com/page/72445/" target="_blank">巨大轉變!教你使用ASP.NET MVC2新功能</a> <a href="http://kb.cnblogs.com/page/72166/" target="_blank">巨大轉變!ASP.NET MVC2使用者界面新實踐</a>

繼續閱讀