1. 使用Request.Form

  MVC 将页面简单化,与WebForm中的事件机制完全不同,就和普通的html标签表单提交没有任何区别(当然WebForm中的事件机制其实也是表单提交)。在表单提交之后,在Controller action中可以以Request.Form["key"] 的方式获取到值。

Code
1 <%Html.BeginForm("Index", "Home", FormMethod.Post); %>
2   <p>
3   编号:<%=Html.TextBox("Id", "", new { name="Id"})%>
4   </p>
5   <p>
6   姓名:<%=Html.TextBox("Name", "", new { name = "Name" })%>
7   </p>
8   <input type="submit" value="Submit" />
9   <%Html.EndForm(); %>

  后台Action 的处理方式如下:

Code
 1 public ActionResult Show()
 2         {
 3             Student stu=new Student();
 4             if (!string.IsNullOrEmpty(Request.Form["Id"]))
 5             {
 6                 stu.Id = Convert.ToInt32(Request.Form["Id"]);
 7             }
 8             stu.Name=Request.Form["Name"];
 9             return View("Index");
10         }

  当然上面是以Post方式提交数据,如果我们以Get方式提交,可以用QueryString 来获取数据。

  Form["Key"] key 为表单元素的name属性值

2.使用FormCollection 方式获取数据

  FormCollection 可以获取表单体积对象的集合

Code
1 public ActionResult Show(FormCollection formCollection)
2         {
3             Student stu = new Student();
4             stu.Id = Convert.ToInt32(formCollection["Id"]);
5             stu.Name =formCollection["Name"];
6             return View("Index");
7         }

  提交数据的时候,我们希望将表单中的数据自动封装成一个对象,我们可以使用UpdateModel<T>() 这个方法。它可以讲表单提交过来的数据自动封装为对应的实体对象。这样可以节省我们去封装对象数据的时间。与UpdateModel<T>()相似的还有一个TryUpdateModel() 方法,这个可以捕获相应的封装时候出现的异常,用法如下 

Code
1 public ActionResult Show(FormCollection formCollection)
2         {
3             Student stu = new Student();
4             stu.Id = 1;
5             stu.Name = "aa";

7             UpdateModel(stu, new[] { "Id"});
8             return View("Index");
9         }

  上面的方法,UpdateModel 第一个参数是封装表单数据到那个对象中去,后面的这个参数是对应到那个属性。这个时候就要注意,表单的name属性和对象的属性名称就必须相同,这样才能对应数据

3.直接提取表单数据

  使用这种方法方式可以将表单中提交的数据直接封装为对象,就和上面说到的UpdateModel 一样。同时表单中输入框的name属性在这个封装的对象中必须存在相同的属性,否则不能封装。

1 public ActionResult Show(Student stu)
2         {

4             return View("Index");
5         }

  如果表单提交的是两个对象的数据,有两种方式,一是把这两个对象作为属性封装到一个对象中去。另一种就是在使用acition中的参数来指定:

Code
<%using (Html.BeginRouteForm(new { controller = "Show", action = "Home" }))
      {%>
    <p>
        <label>
            用户名1:</label><%=Html.TextBox("a.username") %></p>
    <p>
        <label>
            密码1:</label><%=Html.TextBox("a.password") %></p>
    <p>
        <label>
            用户名2:</label><%=Html.TextBox("b.username") %></p>
    <p>
        <label>
            密码2:</label><%=Html.TextBox("b.password") %></p>
    <p>
        <input type="submit" /></p>
    <%      }%>
1 public ActionResult Show(Student a,Person b)
2         {
3             return View("Index");
4         }

以上这种方式就能在表单提交的时候封装两种类型的实体数据 MVC中的这种表单提交方式可以节省很多时间,使程序员更加侧重于业务逻辑的实现,而不是专注程序代码属性数据的封装。相当于WebForm来说,这种方式更加人性化。而且它不会什么那些ViewState的那些一长串而又看不懂的数据,大大减少了页面容量的大小,这也不能说不是提高页面下载速度的一个好办法。

MVC进阶学习--View和Controller之间的数据传递(二)的更多相关文章

  1. MVC进阶学习--View和Controller之间的数据传递(一)

    1.使用ViewData ViewData 的是ControllerBase 的一个属性,是一个数据字典类型的,其实现代码如(这段代码来自asp.net MVC开源项目中源码)下: Code   1  ...

  2. 【MVC框架】——View和Controller之间的传值

    在MVC中,Controller运行一个能够说是路由功能.它通过View传过来的数据,来决定应该调用哪一个Model,相同会把Model处理完的数据传给View,所以就总是涉及到Controller和 ...

  3. 【MVC架构】——怎样利用Json在View和Controller之间传递数据

    在MVC架构中,尽管非常多东西和三层非常相似,可是也有非常大的差别.就比方传递数据.在三层架构中,传递数据就仅仅要一层返回,另外一层用同样类型的变量来接收即可了.在MVC中,事实上原理是一样的,Con ...

  4. ASP.NET MVC3中Controller与View之间的数据传递

    在ASP.NET MVC中,经常会在Controller与View之间传递数据,因此,熟练.灵活的掌握这两层之间的数据传递方法就非常重要.本文从两个方面进行探讨: 一.  Controller向Vie ...

  5. View 与 Controller 之间的delegate(代理)传值

    这个代理传值是经常使用的一种传值方式,下面介绍一种View 和 Controller 之间的代理传值方法. 先建立一个View视图 如 LoginView 是继承于一个UIView 在LoginVie ...

  6. MVC(Model(模型) View(视图) Controller(控制器))

    复习 1.      商品表 增删改查 index.php  add.php   view.php   edit.php   action.php 2.      MVC(Model(模型)  Vie ...

  7. ASP.NET MVC 之控制器与视图之间的数据传递

    今天,我们来谈谈控制器与视图之间的数据传递. 数据传递,指的是视图与控制器之间的交互,包括两个方向上的数据交互,一个是把控制器的数据传到视图中,在视图中如何显示数据,一个是把视图数据传递到控制器中, ...

  8. [转]ASP.NET MVC中的两个Action之间值的传递--TempData

    本文转自:ASP.NET MVC中的两个Action之间值的传递--TempData 一. ASP.NET MVC中的TempData 在ASP.NET MVC框架的ControllerBase中存在 ...

  9. Activity之间的数据传递-android学习之旅(四十七)

    activity之间的数据传递主要有两种,一种是直接发送数据,另一种接受新启动的activity返回的数据,本质是一样的 使用Bundle传递数据 Intent使用Bundle在activity之间传 ...

随机推荐

  1. C++之++运算符重载问题

    记录++之前先记一下左右值和存取数据的问题 数据的存放分三个部分,堆区,栈区和静态变量区 左值可以更改,右值不能更改 栈区和堆区存储的都是左值,可以随意更改其值,静态变量区部分数据是右值,比如cons ...

  2. [CTSC2018]假面(概率DP)

    考场上以为CTSC的概率期望题都不可做,连暴力都没写直接爆零. 结果出来发现全场70以上,大部分AC,少于70的好像极少,感觉血亏. 设a[i][j]表示到当前为止第i个人的血量为j的概率(注意特判血 ...

  3. nginx的location匹配

    http://www.cnblogs.com/lidabo/p/4169396.html 这个博主写的非常好 location: 先匹配普通location,再匹配正则表达式 1.而且选择了最大前缀匹 ...

  4. mysql----kill慢查询

    每个与mysqld的连接都在一个独立的线程里运行,您可以使用SHOW PROCESSLIST语句查看哪些线程正在运行,并使用KILL thread_id语句终止一个线程. 如果您拥有SUPER权限,您 ...

  5. Spring Boot中使用Feign调用时Hystrix提示异常:"could not be queued for execution and no fallback available."以及"Rejected command because thread-pool queueSize is at rejection threshold"

    说明: 1.我还没有真正理解Spring Cloud的精髓,现只停留在使用阶段,可能存在分析不到位的问题. 1.这个是由于线程池的最大数量导致的,官方说随着线程池的数量越大,资源开销也就越大,所以调整 ...

  6. 磁盘爆满导致MySQL无法启动:Disk is full writing './mysql-bin.~rec~' (Errcode: 28). Waiting for someone to free space...

    今天收到监控邮件说博客访问失败.打开页面一看,硕大的502 Bad Gateway,ping了一下VPS发现是通的,SSH连接上去看了下Nginx日志发现没问题,重启lnmp的时候发现Mysql起不来 ...

  7. pr_debug、dev_dbg等动态调试二

    内核版本:Linux-3.14 作者:彭东林 邮箱:pengdonglin137@163.com 下面我们简要分析 1: echo -n "file demo.c +p" > ...

  8. cocurrent包semaphore信号量

    semaphore英[ˈseməfɔ:(r)]美[ˈsɛməˌfɔr, -ˌfor]n. 臂板信号系统,(铁道)臂板信号装置; Semaphore 用法 信号量主要有两种用途: 保护一个重要(代码)部 ...

  9. 在eclipse上部署openfire 3.9.1源码,並配置openfire

    参考文章:https://my.oschina.net/u/1409622/blog/205603 在网上找了很久部署openfire源码的文章,由于我使用的是最新的3.9.1源码,试了很多种部署方法 ...

  10. applicationContext.xml文件如何调用外部properties等配置文件

    只需要在applicationContext.xml文件中添加一行: <!-- 导入外部的properties文件 --> <context:property-placeholder ...