爱上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提交就可以了。

 回到目录

posted @ 2012-06-26 15:10  张占岭  阅读(4604)  评论(1编辑  收藏  举报