• 使用System.Web.Mvc.Ajax


    摘自Rocky Ren

    一、使用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

    复制代码

        @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如下:

     

    复制代码

        <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

            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>:

     

    <div id="restaurantList">...

    </div>

     

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

     

            new AjaxOptions()

            {

               ....

                LoadingElementId = "loding",

                LoadingElementDuration = 2000

            }))

     

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

             cshtml文件中添加:

     

    <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创建超链接

     

    复制代码

                            @*@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为:

     

    复制代码

    <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:

    复制代码

            /// <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元素:

     

                    <div id="renderBody">

                              ....         

                    </div>         

     

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

     

              与1.1第四步相同。

     

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

     

    第一步:添加表单:

     

     

    @* ---------------------------------------------------------

             需要手工为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为:

     

    <form data-otf-ajax-updatetarget="#restaurantList" 

              data-otf-ajax="true" 

              action="/Reviews" 

              method="post" 

              novalidate="novalidate">

     

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

     

        这里与1.1的第二步一样。

     

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

     

    $(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而已。

  • 相关阅读:
    git push 报错:missing Change-Id in commit message footer
    script命令录屏
    dubbo.xsd
    常规项目用到的jar包之maven的pom.xml
    WebSocket Demo
    对程序员有帮助的站点集锦
    java之finally的用法
    Java 中的四种引用
    字符串类型的对象与引用及字符串常量池详解
    如何掌握一项新的技能?
  • 原文地址:https://www.cnblogs.com/zhuyuan28/p/3913874.html
Copyright © 2020-2023  润新知