ASP.NET MVC4 IN ACTION學習筆記-第六波[Ajax in ASP.NET MVC][2/3]

來源:互聯網
上載者:User

閱讀第六波導航:

ASP.NET MVC4 IN ACTION學習筆記-第六波[Ajax in ASP.NET MVC][1/3]

ASP.NET MVC4 IN ACTION學習筆記-第六波[Ajax in ASP.NET MVC][3/3]

         原著:ASP.NET MVC 4 IN ACTION

         大家好!

         我是茗洋芳竹,首先聲明,我不是一個翻譯人員,我是個90後程式員.

         本波原文含有一些JQuery基礎的教程,在本波中我省略了.所以如果你沒有JQuery基礎,我認為你沒有必要繼續閱讀下去,建議你還是先瞭解一下JQuery相關的內容!由於你們的支援,我打算把自己的部落格做的有品質點.前幾天學了一點前端的知識,所以MVC4系列部落格拖到了今天才發布了,與原計劃晚了幾天,首先道個歉.

         老實說,這篇部落格的內容真的很多~

 

7.2     ASP.NET MVC Ajax Helpers

           到目前為止,我們都是看了在用戶端如何寫JavaScript代碼發送資料到伺服器和從伺服器取回資料。我們現在來看一下使用ASP.NET MVC操作Ajax,我們使用Ajax Helpers.

           一開始,我們會看幾個Ajax方法,還有它們和jQuery或者JavaScript庫關聯的。通過它們也可以實現我們手工寫jQuery代碼的部分實現的效果。

           這些使用到的helpers,是AjaxHelper類的拓展方法,這個類可以通過Ajax發送和獲得資料後,自動地用來產生HTML標籤,這些Helpers如下:

(這裡英文的不要緊,不要怪我了,因為我覺得翻譯過來也不太好理解,還不如寫demo理解出來)

在這些技術下,Ajax Helper利用了JavaScript庫進行了真實的Ajax請求。這些標籤沒有和任何一個特定的庫進行綁定,而是利用了一個適配器層,這個適配器層知道如何發出Ajax請求。ASP.NET MVC有個能調節Microsoft Ajax和jQuery的適配器,就是這個適配器。它們兩個哪個被使用取決於這個應用程式的配置。

當你建立一個新的ASP.NETMVC項目的時候,在最外層的web.config中有下面一行代碼

如果設定被啟用(true的時候),通過Ajax Helper產生的標籤(markup)將會使用和上波文章7.1節位置的代碼一樣,就可以使用unobtrusive JavaScript這種簡單的方法實現Ajax效果。但是設定被禁用(false)的時候,這些Helpers就會使用Microsoft Ajax庫替代產生markup。推薦把它設定為true,我們會在7.2.4節中講到如果設定為false的時候,會發生什麼。

NOTE:除了在web.config中設定UnobtrusiveJavaScriptEnabled為true外,你也可以在Global.asax檔案的Application_Start中設定HtmlHelper.UnobtrusiveJavaScriptEnabled屬性為true作為一個全域的設定,一個替代的思路。

 

 

根據UnobtrusiveJavaScriptEnabled是true還是false,ASP.NET MVC's Ajax helpers 將會產生一個相容特定的適配器層的markup,這個適配器層知道如何接受這些標籤,然後調用合適的JavaScript庫去實際工作。

 

 

下面是ASP.NET MVC Ajax helpers和

JavaScript庫的關係圖

 

 

 

 

 

 

 

 

 

 

7.2.1    Ajax.ActionLink

         接下來我們使用一下ActionLink Ajax Helper,修改Index.cshtml檔案代碼如下:

          

接下來我們使用一下ActionLink Ajax Helper,Controller我們就不要修改了,我們修改Index.cshtml視圖.你可以對比一下,Html的ActionLink和Ajax的ActionLink:
第一個參數-要顯示的文本,第二個參數-請求的控制器中的action名字,在Ajax的ActionLink中,有個AjaxOptions參數,這裡代碼的意思是,將請求成功後的資料,以替換(replace)的方式,把id為privacy的DOM元素中的html代碼全部替換掉。
InsertionMode是個枚舉,你可以自己試著用一下。
   1:  @{
   2:      ViewBag.Title = "Index";
   3:  }
   4:  @section head{
   5:      <script type="text/javascript"  src="@Url.Content("~/scripts/AjaxDemo.js")"></script>
   6:       <script type="text/javascript" src="@Url.Content("~/scripts/jquery.unobtrusive-ajax.js")"></script>
   7:      }
   8:   
   9:      @Html.ActionLink("Show the privacy policy",
  10:              "PrivacyPolicy", null, new { id = "privacyLink" })
  11:  <br />
  12:  @Ajax.ActionLink("Show the privacy policy2", 
  13:                             "PrivacyPolicy", new AjaxOptions {
  14:                               InsertionMode = InsertionMode.Replace, UpdateTargetId = "privacy" 
  15:                             })
  16:  <div id="privacy"></div>

按下F5運行程式,我們可以查看到通過Ajax助手產生的html代碼是下面這個樣子的,我們看到了熟悉的unobtrusive javascript風格的代碼

<a data-ajax="true" data-ajax-mode="replace" data-ajax-update="#privacy" href="/AjaxHelper/PrivacyPolicy">Show the privacy policy2</a>

當頁面載入的時候,在jquery-unobtrusive.ajax的指令碼將會尋找含有data-ajax屬性的所有連結,找到後綁定單擊事件。同樣地,如果瀏覽器禁用了Javascript,這個link將作為一個正常的link的作用,回到了non-Ajax(無Ajax)行為。

 HTML5 Data Attributes

data-*屬性,比如data-ajax和data-ajax-update都是著名的HTML5的屬性(Attribute),它提供了使用額外的中繼資料(  metadata)來實現註解(annotate)HTML element元素。雖然你在這裡你提供了Ajax請求的相關資訊,但是你在這裡可以在用戶端,寫你自己將要訪問的中繼資料(metadata)

雖然這些自訂屬性是HTML5詳細指南的一部分,但是它們在不支援(例如IE6)HTML的瀏覽器上沒有任何問題,可以正常的工作。

7.2.2    Ajax.BeginForm

 

 

   同樣地你也可以使用 ASP.NET’s  Ajax.BeginForm helper 也可以實現非同步提交表單資料。

  開啟這個頁面,我們繼續寫代碼

添加代碼後代碼如下:

@model IEnumerable<string> 
 
@{
    ViewBag.Title = "Index";
}
@section head{
    <script type="text/javascript" src="@Url.Content("~/scripts/jquery.unobtrusive-ajax.js")"></script>
}
 
 
<h4>Comments</h4>
 
<ul id="comments">
    @foreach (var comment in Model)
    {
        <li>@comment</li>
    }
</ul>
 
@using (Ajax.BeginForm("AddComment", new AjaxOptions { UpdateTargetId = "comments", InsertionMode = InsertionMode.InsertAfter }))
{
    @Html.TextArea("Comment", new { rows = 5, cols = 50 })
    <br />
    <input type="submit" value="Add Comment" />
}
 
 
@*@Html.ActionLink("Show the privacy policy",
            "PrivacyPolicy", null, new { id = "privacyLink" })*@
<br />
@Ajax.ActionLink("Show the privacy policy2",
                           "PrivacyPolicy", new AjaxOptions
                           {
                               InsertionMode = InsertionMode.Replace,
                               UpdateTargetId = "privacy"
                           })
 
 
<div id="privacy"></div>

跟我們在第二章看到的Html.BeginForm一樣,這個Ajax.BeginForm,也用using包裹,BeginForm建立一個表單。用}表示結束,等同於<form/>

我們重載了BeginForm的兩個參數-第一個控制器中的action名字,controller不寫,就代表當前的view所對應的controller。AjaxOptions對象跟Ajax.ActionLink的一樣的

AjaxHelpersController裡面添加代碼如下

  static readonly List<string> _comments = new List<string>();
 
        public ActionResult Index()
        {
            return View(_comments);
        }
 
        [HttpPost]
        public ActionResult AddComment(string comment)
        {
            _comments.Add(comment);
 
            if (Request.IsAjaxRequest())
            {
                ViewBag.Comment = comment;
                return PartialView();
            }
 
            return RedirectToAction("Index");
        }
 
        public ActionResult PrivacyPolicy()
        {
            if (Request.IsAjaxRequest())
            {
                return PartialView();
            }
 
            return View();
        }

然後同樣的,我們複製一下CustomAjax檔案夾的下的AddComment.cshtml到AjaxHelper檔案夾下。

當運行這個頁面的時候,原理都一樣的,雖然表單被額外的 data-ajax屬性修飾了,跟ActionLink很像,下面是:

這樣,關於表單的 漸進增強模式(progressive enhancement)已經完成了,以前我們完成的HTML.ActionLink變成了Ajax.ActionLink,現在是表單過渡了。表單有Html.BeginForm變成了Ajax.BeginForm,通過使用了jquery.unobtrusive-ajax 指令碼,表單就會以Ajax形式提交了,但是如果用戶端禁用了JavaScript,這個表單就會以普通的表單發送post請求。

7.2.3    Ajax Options

在幾節裡面,你看到了ActionLink和BeginForm 的Ajax helper都有AJaxOptions對象,這個對象表明了Ajax的結果怎麼被處理。它定義的屬性如下:

如果你以前有jQuery經驗,這些好多都能看的懂。

除了LoadingElementDuration,所有的這些選項在以前的ASP.NET MVC2中都有。但是把這些option放到頁面的標籤裡不一樣了。你看到了,在HTML elements裡,這些選項(options)都以data-*形式產生,然而在MVC2中,他們是被插入到頁面裡面的,以一種更unobtrusive的作法完成。

 

7.2.3    跟以前版本的ASP.NET MVC不同的地方

雖然Ajax helpers 在MVC1就已經是MVC中的一部分了,現在jQuery是預設的。在以前版本的架構,這些helpers都是使用Microsoft Ajax Library,而且沒有採用unobtrusive的方式產生JavaScript。我們可以通過修改web.config節點下的AppSettings下的UnobtrusiveJavaScriptEnabled屬性改為false,就可以恢複以前版本架構的行為了

比如,現在是true,我們把UnobtrusiveJavaScriptEnabled改為false後運行項目:

現在我們使用Ajax.ActionLink後產生的程式碼如下:

把UnobtrusiveJavaScriptEnabled設為false後,沒有再採用data-ajax屬性了,所有的中繼資料都被OnClick事件替代了,為了讓程式正確運行,所以架構要求你必須引用MicrosoftAjax.js 和 MicrosoftMvcAjax.js ,跟unobtrusive風格的代碼比,可讀性不強,不直觀,它也破壞了 Unobtrusive Javascript原則

如果你正在把你以前ASP.NET MVC版本的網站升級,你需要保留這些行為,為了提高相容性,需要把UnobtrusiveJavaScriptEnabled設為false。但是在其他的情形下,把UnobtrusiveJavaScriptEnabled設為true是最好的,因為這樣,HTML產生的時候更直觀,可讀性強,而且微軟很看重ajax的這種Unobtrusive寫法,並且在更新和研究。

 

 博主留言

為了讓讀者有更好的閱讀體驗,打算將每章的內容分開寫.讓每篇的閱讀起來更舒服一點.

同時我每天可以寫一點,同時每天都可以上傳一點,而不必一次性寫完每章的部落格,而一次性發布

內容過多,那麼每次讀者學習,查看的時候,下載的也就越多了.考慮到這個,所以本篇部落格寫到這裡..

晚安,大家!由於源碼檔案過大,先不發布了,等本章部落格全部完成後,一次性發布。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.