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提交 就可以了。爱上MVC3目录
爱上MVC3系列~Razor模板页
爱上MVC3系列~全局异常处理与异常日志
爱上MVC3系列~使用视图模型的好处及与数据模型之间的赋值问题
爱上MVC3系列~RenderAction与RenderPartial及一个页面多个表单提交
分类: .NET MVC
作者: Leo_wl
出处: http://HdhCmsTestcnblogs测试数据/Leo_wl/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
版权信息查看更多关于RenderAction与RenderPartial及一个页面多个表单提交的详细内容...