浅析Asp.net MVC 中Ajax的使用

Posted 采菊东篱下,悠然见南山!

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了浅析Asp.net MVC 中Ajax的使用相关的知识,希望对你有一定的参考价值。

在ASP.NET MVC beta中我们可以使用Ajax.BeginForm, Ajax.ActionLink来进行Ajax调用,同样我们也可以使用一些支持Ajax 框架如jQuery来简化对ajax的调用。
 

一、使用System.Web.Mvc.Ajax

  1.1 System.Web.Mvc.Ajax.BeginForm

  1.2 System.Web.Mvc.Ajax.ActionLink

二、手工打造自己的“非介入式”Javascript”

一、使用System.Web.Mvc.Ajax

 技术分享

1.1 System.Web.Mvc.Ajax.BeginForm

     第一步:用Ajax.BeginForm创建Form

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@using (Ajax.BeginForm(
  new AjaxOptions()
  {
    HttpMethod = "post",
    Url = @Url.Action("Index","Reviews"),
    InsertionMode = InsertionMode.Replace,
    UpdateTargetId = "restaurantList",
    LoadingElementId = "loding",
    LoadingElementDuration = 2000
  }))
{
   <input type="search" name="searchItem"/>
   <input type="submit" value="按名称搜索"/>
}

       最终生成的form如下:

1
2
3
4
5
6
7
8
9
<form id="form0" method="post"
   data-ajax-url="/Reviews"
   data-ajax-update="#restaurantList"
   data-ajax-mode="replace"
   data-ajax-method="post"
   data-ajax-loading-duration="2000"
   data-ajax-loading="#loding"
   data-ajax="true"
   action="/Reviews" novalidate="novalidate">

第二步:创建Ajax.BeginForm的new AjaxOptions()对象的Url指向的Action

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
new AjaxOptions()
   {
      ...
     Url = @Url.Action("Index","Reviews")   
     ...
      }
   public ActionResult Index(string searchKey = null)
   {
     var model = _restaurantReviews.Where(r => searchKey == null || r.Name.ToLower().Contains(searchKey.ToLower().Trim()))
       .OrderByDescending(r => r.Rating)
       .Take(100)
       .Select(r=>new RestaurantReview()
       {
         City = r.City,
         Country = r.Country,
         Id = r.Id,
         Name = r.Name,
         Rating = r.Rating
       }).ToList();
     if (Request.IsAjaxRequest())
     {
       System.Threading.Thread.Sleep(1000 * 3);//模拟处理数据需要的时间
       //return View(model)会返回整个页面,所以返回部分视图。
       return PartialView("_RestaurantPatialView", model);
     }
     return View(model);
   }

 注意:

    关于使用System.Web.Mvc.Ajax的说明:

       Controller的Action方法:

         (1)当显式添加[HttpPost],传给System.Web.Mvc.Ajax的AjaxOptions()的HttpMethod只能为 "post",

         (2)当显式添加[HttpGet],传给System.Web.Mvc.Ajax的AjaxOptions()的HttpMethod只能为 "get",

         (3)当都没有显式添加[HttpPost]和[HttpGet],传给System.Web.Mvc.Ajax的AjaxOptions()的HttpMethod可以为 "get"也可以为"post",

      第三步:添加要承载更新页面的html元素,

        也就是添加添加AjaxOptionsd对象的UpdateTargetId 参数指定的Id为restaurantList的html元素:

  这里在页面中添加:id为restaurantList的<div>:

1
2
<div id="restaurantList">...
</div>

       第四步:(可选)为增强用户体验,添加AjaxOption对象的LoadingElementId参数指定的Id为loding的html元素:

1
2
3
4
5
6
new AjaxOptions()
  {
    ....
    LoadingElementId = "loding",
    LoadingElementDuration = 2000
  }))

          这里在页面中添加:id为loding的元素,添加了包含一个动态的刷新图片<div>:

          技术分享

         cshtml文件中添加:

1
2
3
<div id="loding" hidden="hidden">
  <img class="smallLoadingImg" src="@Url.Content("~/Content/images/loading.gif")" />
</div>

1.2 System.Web.Mvc.Ajax.ActionLink

           System.Web.Mvc.Ajax.ActionLink与System.Web.Mvc.Ajax.BeginForm用法基本一致

            第一步:使用System.Web.Mvc.Ajax.ActionLink创建超链接                

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@*@Html.ActionLink(item.Name, "Details", "Reviews",new{id = item.Id},new {@class ="isStar"})*@
           @*<a class="isStar" href="@Url.Action("Details","Reviews", new {id = item.Id})">@item.Name</a>*@
           @*使用Ajax的超链接*@
           @{
             var ajaxOptions = new AjaxOptions()
             {
               HttpMethod = "post",
               //Url = @Url.Action(""),
               UpdateTargetId = "renderBody",
               InsertionMode = InsertionMode.Replace,
               LoadingElementId = "loding",
               LoadingElementDuration = 2000
             };
             @Ajax.ActionLink(item.Name, "Details", "Reviews", new { id = item.Id }, ajaxOptions, new {@class="isStar"})
           }

对应生成的最终html为:

1
2
3
4
5
6
7
8
<a class="isStar"
  href="/Reviews/Details/1"
  data-ajax-update="#renderBody"
  data-ajax-mode="replace"
  data-ajax-method="post"
  data-ajax-loading-duration="2000"
  data-ajax-loading="#loding"
  data-ajax="true">

     第二步:定义出来响应超链接的Action:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/// <summary>
   ///关于使用System.Web.Mvc.Ajax的说明:
   /// Controller的Action方法:
   ///  (1)当显式添加[HttpPost],传给System.Web.Mvc.Ajax的AjaxOptions()的HttpMethod只能为 "post",
   ///  (2)当显式添加[HttpGet],传给System.Web.Mvc.Ajax的AjaxOptions()的HttpMethod只能为 "get",
   ///   (3) 当都没有显式添加[HttpPost]和[HttpGet],传给System.Web.Mvc.Ajax的AjaxOptions()的HttpMethod可以为 "get"也可以为"post",
   /// </summary>
   /// <param name="id"></param>
   /// <returns></returns>
   public ActionResult Details(int id=1)
   {
     var model = (from r in _restaurantReviews
       where r.Id == id
       select r).FirstOrDefault();
     if (Request.IsAjaxRequest())
     {
       return PartialView("_RestaurantDetails", model);
     }
     return View(model);
   }

           第三步:定义承载更新部分的html元素:

1
2
3
<div id="renderBody">
          ....    
     </div>

           第四步:(可选)为增强用户体验,添加AjaxOptionsd对象的LoadingElementId参数指定的Id为loding的html元素:

          与1.1第四步相同。

二、手工打造自己的“非介入式”javascript

第一步:添加表单:

1
2
3
4
5
6
7
8
9
10
11
@* ---------------------------------------------------------
     需要手工为Form添加些属性标签,用于锚点
  模仿MVC框架的构建自己的“非介入式Javascript”模式
  -------------------------------------------------------*@
<form method="post"
   action="@Url.Action("Index")"
   data-otf-ajax="true"
   data-otf-ajax-updatetarget="#restaurantList">
  <input type="search" name="searchItem" />
  <input type="submit" value="按名称搜索" />
</form>

生成的form为:

1
2
3
4
5
<form data-otf-ajax-updatetarget="#restaurantList"
     data-otf-ajax="true"
     action="/Reviews"
     method="post"
     novalidate="novalidate">

第二步:添加处理表单的Action:

    这里与1.1的第二步一样。

第三步:添加Js处理表单:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
$(function () {
  var ajaxFormSubmit = function() {
    var $form = $(this);
    var ajaxOption = {
      type: $form.attr("method"),
      url: $form.attr("action"),
      data: $form.serialize()
    };
    $.ajax(ajaxOption).done(function(data) {
      var updateTarget = $form.attr("data-otf-ajax-updatetarget");
      var $updateTarget = $(updateTarget);
      if ($updateTarget.length > 0) {
        var $returnHtml = $(data);
        $updateTarget.empty().append(data);
        $returnHtml.effect("highlight");
      }     
    });
    return false;
  };
  $("form[data-otf-ajax=‘true‘]").submit(ajaxFormSubmit);
});

注意:

  所谓的“非介入式Javascript”模式,是指假如没有添加这一步,表单照样能被处理,只是没用到Ajax而已。

如对本文有疑问,请提交到交流社区,广大热心网友会为你解答!! 点击进入社区






以上是关于浅析Asp.net MVC 中Ajax的使用的主要内容,如果未能解决你的问题,请参考以下文章

浅析ASP.NET Webform和ASP.NET MVC

识别 ASP.NET MVC 代码中的 Angular js AJAX 调用

ASP.NET MVC 复制MVC项目代码到同一个项目的时候报错The request for ‘home’ has found the following matching controll(代码片

模型没有在 asp.net mvc 中使用 ajax post 更新?

如何在不刷新的情况下使用 Ajax 在 ASP.NET MVC 中保存表单数据

ASP.NET MVC ajax数组,模型绑定问题。