好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

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

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及一个页面多个表单提交的详细内容...

  阅读:28次