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

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的那些一长串而又看不懂的数据,大大减少了页面容量的大小,这也不能说不是提高页面下载速度的一个好办法。

时间: 2024-07-31 23:55:34

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

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

1.使用ViewData ViewData 的是ControllerBase 的一个属性,是一个数据字典类型的,其实现代码如(这段代码来自asp.net MVC开源项目中源码)下: Code  1 public class ViewDataDictionary : IDictionary<string, object> {  2   3         private readonly Dictionary<string, object> _innerDictionary = ne

MVC进阶学习--个性化目录结构(二)

(一)  浅谈MVC目录结构 在上一篇(<MVC进阶学习--个性化目录结构(一)>)中了解到了MVC 的基本目录结构,以及各个目录的作用.我们只是说到了表面的目录结构,没有了解到它运行的原理.是不是MVC的目录结构只能有那种固定的模式呢,我们能否根据自己的需要扩展这些目录结构呢.答案是肯定的.因为asp.net MVC中引用了WebFromViewEngine 这个视图引擎 (二) WebFormViewEngine视图引擎 1.IView接口    IView接口是对MVC结构中View对象

Android实现Activities之间进行数据传递的方法

  Android实现Activities之间进行数据传递的方法 本文实例讲述了Android实现Activities之间进行数据传递的方法.分享给大家供大家参考.具体分析如下: 首先,先说明一下Activity的启动及关闭: 1. startActivity(Intent intent); 启动Activity finish(); 结束当前Activity 2. startActivityForResult(Intent intent, int requestCode); 以指定的请求码req

【iOS7的一些总结】2、视图控制器ViewControllers之间的数据传递(1)

这里我们用一个demo来说明ios是如何在视图控制器之间传递重要的参数的.本文先从手写UI来讨论,在下一篇文章中讨论在storyboard中传递数据. 首先新建一个空工程,并添加一个根视图控制器类,如下图所示: # 在函数didFinishLunchingWithOption中添加几行代码,完成后如下: - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)la

Android实现Activities之间进行数据传递的方法_Android

本文实例讲述了Android实现Activities之间进行数据传递的方法.分享给大家供大家参考.具体分析如下: 首先,先说明一下Activity的启动及关闭: 1. startActivity(Intent intent);  启动Activity        finish();  结束当前Activity 2. startActivityForResult(Intent intent, int requestCode);  以指定的请求码requestCode启动Activity fini

javascript表单之间的数据传递

javascript|数据  今天有朋友问我关于用javascript来进行页面各表单之间的数据传递的问题,我以前也写过,不过从来没有注意,今天总结了一下,希望能够给大家一些帮助,也帮助我总结以前学过,用过的知识.    一,最简单的就是同一个网页里的表单的数据传递.      举个实例,一个网页上有两个表单,每个表单里一个文本框,一个按钮.点按钮互相对操作对方的文本框的值.我们举的例子是把一个文本框付给另一个文本框.具体的HTML代码如下:  <html><head><ti

&amp;#106avascript表单之间的数据传递

数据     今天有朋友问我关于用javascript来进行页面各表单之间的数据传递的问题,我以前也写过,不过从来没有注意,今天总结了一下,希望能够给大家一些帮助,也帮助我总结以前学过,用过的知识.     一,最简单的就是同一个网页里的表单的数据传递.      举个实例,一个网页上有两个表单,每个表单里一个文本框,一个按钮.点按钮互相对操作对方的文本框的值.我们举的例子是把一个文本框付给另一个文本框.具体的HTML代码如下:  <html><head><title>

&amp;#106avascript表单之间的数据传递(1)

数据     今天有朋友问我关于用JAVASCRIPT来进行页面各表单之间的数据传递的问题,我以前也写过,不过从来没有注意,今天总结了一下,希望能够给大家一些帮助,也帮助我总结以前学过,用过的知识.     一,最简单的就是同一个网页里的表单的数据传递.      举个实例,一个网页上有两个表单,每个表单里一个文本框,一个按钮.点按钮互相对操作对方的文本框的值.我们举的例子是把一个文本框付给另一个文本框.具体的HTML代码如下: <html><head><title>U

【iOS7的一些总结】3、视图控制器ViewControllers之间的数据传递(2)

上文中记录了在手写代码实现UI的情况下,界面切换时不同视图控制器之间数据传递的机制.显示和消除界面使用的函数时presentViewController和dismissViewController函数,数据传递则可以采用代理.通知等机制.本文记录的是使用storyboard实现界面的情况下,采用segue相关的方法实现与上文中相同的功能. 首先要做的是新建一个单视图工程,建立完成后会生成一组(一个头文件和一个源文件称为一组)AppDelegate类,一组ViewController类,一个sto