• 爱上MVC3系列~RenderAction与RenderPartial及一个页面多个表单提交


    回到目录

    今天做项目的时候发现了个问题,是关于RenderAction和RenderPartial的,它们在MVC2的时候就出现了,不是MVC3的新东西,那为什么要拿出来说呢,其主要原因在于,我对它们的了解在MVC3时代有了更上一层的认识,呵呵。

    先说一下他们的作用:

    RenderAction:渲染分部视图到页面上,他要求你提供一下Action的名称和Controller的名称

    RenderPartial:渲染分部视图到页面上,他要求你提代一个分部视图的名称,即它的路径,如果是当然Controller下或者Shared下的页面,直接写它的名称即可

    再说一下他们的区别:

    RenderAction:它是走controller下的action方法的,即走[HttpGet]特性的方法(默认下就是HttpGet)

    RenderPartial:他不走controller下的action方法,即使你有这个方法,他也不会走,但一般使用RenderPartial时,都是把数据写在页面上的,它的action方法完全多余。

    下面是一个表单提交的实现,它是使用分部视图完成的表单模块,它有两个action,以便去实现GET请求和POST请求,看代码:

     1         /// <summary>
     2         /// 用户登陆
     3         /// </summary>
     4         /// <returns></returns>
     5         public ActionResult UserLogOn()
     6         {
     7             return View(new UserLogOnModel());
     8         }
     9         [HttpPost]
    10         public ActionResult UserLogOn(UserLogOnModel entity)
    11         {
    12             if (ModelState.IsValid)
    13             {
    14                 VM = user_InfoManager.UserLogOn(new User_Info { Email = entity.Email, Password = entity.Password });
    15                 if (VM.IsComplete)
    16                 {
    17                     return RedirectToAction("Index", "Home");
    18                 }
    19                 else
    20                 {
    21                     VM.ToList().ForEach(i => ModelState.AddModelError("", i));
    22                 }
    23             }
    24 
    25             return View();
    26         }

    而在页面视图上,通过视图模型UserLogOnModel进行页面元素的填充及表单验证,在默认情况下,我们把模型赋了默认值(就是表单元素input上的value)

     1     /// <summary>
     2     /// 用户登陆
     3     /// </summary>
     4     public class UserLogOnModel
     5     {
     6         public UserLogOnModel()
     7         {
     8             this.Email = "登陆名";
     9             this.Password = "密码";
    10         }
    11         [Required]
    12         [DataType(DataType.EmailAddress)]
    13         [Display(Name = "邮箱")]
    14         public string Email { get; set; }
    15         [Required]
    16         [DataType(DataType.Password)]
    17         [Display(Name = "密码")]
    18         public string Password { get; set; }
    19     }

    当页面上触发POST事件后,就会到HTTPOST对应的action上,进行处理,ModelState是指视图模型的状态,如果验证不通过,它的IsValid属性为false,并且它会自动绑定到表单元素

    上,这一样都是基于MVC的,前台代码可能是这样:

     1 @model TsingDa.Ask.Models.UserLogOnModel
     2 @{Layout = "";}
     3 @using (Html.BeginForm("UserLogOn", "Home", FormMethod.Post, new { id = "LogOn" }))
     4 {
     5     @Html.ValidationSummary(true)
     6     <div class="editor-field">
     7         @Html.TextBoxFor(m => m.Email)
     8         @Html.ValidationMessageFor(m => m.Email)
     9     </div>
    10     <div class="editor-field">
    11         @Html.TextBoxFor(m => m.Password)
    12         @Html.ValidationMessageFor(m => m.Password)
    13     </div>
    14     <input type="button" id="logOnBtn" value="登陆" />
    15 }
    16 <script type="text/javascript">
    17     $("#logOnBtn").click(function () {
    18         $.ajax({
    19             url: "/Home/UserLogOn",
    20             data: $("#LogOn").serialize(),
    21             type: "POST",
    22             success: function (data) {
    23                 $("#LogOn").html(data);
    24             }
    25         });
    26     });
    27 </script>

    注意,如果有多个视图中的表单分别有提交动作,必须使用AJAX方法,不能使用表单自己的SUBMIT方式,否则mvc会分不清你到底提交给谁,这也很正常。

    OK,现在就算一个页面上有多个表单,我们使用RenderAction把业务分开处理,用AJAX提交方法分别进行POST提交就可以了。

     回到目录

  • 相关阅读:
    高级数据结构(一)----并查集
    分享复杂的线性动态规划问题(一)
    分享利用微信公众号做淘宝客返利机器人系统的3个技巧
    淘宝京东拼多多三合一cms源码怎么搭建优惠券网站
    微信公众号怎么查京东优惠券之3步搭建自己的找券机器人
    【职场提示】什么时间提出涨薪资更合适?
    项目管理之Git
    快速排序,数组去重
    信息安全风险治理——制度与标准篇
    浅谈漏洞管理实践
  • 原文地址:https://www.cnblogs.com/lori/p/2563739.html
Copyright © 2020-2023  润新知