您的位置:首页 > 其它

RenderAction与RenderPartial及一个页面多个表单提交

2012-06-26 22:41 330 查看
今天做项目的时候发现了个问题,是关于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提交就可以了。

爱上MVC3目录

爱上MVC3系列~Razor模板页

爱上MVC3系列~全局异常处理与异常日志

爱上MVC3系列~使用视图模型的好处及与数据模型之间的赋值问题

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

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐