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://www.cnblogs.com/Leo_wl/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
版权信息查看更多关于RenderAction与RenderPartial及一个页面多个表单提交的详细内容...