Controller与View相互间传递数据

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

Controller向View传递数据

View向Controller传递数据


一、Controller向View传递数据



1.
使用ViewData传递数据


我们在Controller中定义如下:
ViewData[“Message”] = “Hello word!”;
然后在View中读取Controller中定义的ViewData数据,代码如下:
<% = Html.Encode(ViewData[“Message”]) %>


2.
使用TempData传递数据


我们在Controller中定义如下:
TempData[“Message”] = “Hello word!”;
然后在View中读取Controller中定义的TempData数据,代码如下:
<% = Html.Encode(TempData [“Message”]) %>


3.
使用Model传递数据


使用Model传递数据的时候,通常在创建View的时候我们会选择创建强类型View如下图所示:


创建强类型的View以后,View的第一行代码如下所示:

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage" %>


就代表了这个View使用的Model为“MvcInduction.Models.People”

总结:


1.
ViewData与TempData方式是弱类型的方式传递数据,而使用Model传递数据是强类型的方式。

2.
ViewData与TempData是完全不同的数据类型,ViewData数据类型是ViewDataDictionary类的实例化对象,而TempData的数据类型是TempDataDictionary类的实例化对象。

3.
TempData实际上保存在Session中,控制器每次执行请求时都会从Session中获取TempData数据并删除该Session。TempData数据只能在控制器中传递一次,其中的每个元素也只能被访问一次,访问之后会被自动删除。

4.
ViewData只能在一个Action方法中进行设置,在相关的视图页面读取,只对当前视图有效。理论上,TempData应该可以在一个Action中设置,多个页面读取。但是,实际上TempData中的元素被访问一次以后就会被删除。


二、View向Controller传递数据


在ASP.NET MVC中,将View中的数据传递到控制器中,主要通过发送表单的方式来实现。具体的方式有:

1.
通过Request.Form读取表单数据
我们在View层做如下定义:

<% using (Html.BeginForm("ActionName", "ControllerName"))

{ %>

UserName:<% Html.TextBox("UserName"); %>

Password:<% Html.TextBox("Password"); %>

<%} %>

注意:ActionName为对应的Action名,ControllerName为对应的Controller名称

然后在Controller层,通过Request.Form读取表单数据的代码如下所示:

[AcceptVerbs(HttpVerbs.Post)]


public ActionResult ActionName()


{

string username = Request.Form["UserName"];

string password = Request.Form["Password"];

return View();

}


2.
通过FormCollection读取表单数据


我们在View层做如下定义:

<% using (Html.BeginForm("ActionName", "ControllerName"))

{ %>

UserName:<% Html.TextBox("UserName"); %>

Password:<% Html.TextBox("Password"); %>

<%} %>

然后在Controller层,通过FormCollection读取表单数据的代码如下所示:

[AcceptVerbs(HttpVerbs.Post)]

public ActionResult ActionName(FormCollection formCollection)

{

string username = formCollection["UserName"];

string password = formCollection["Password"];

return View();

}


========================================================================



在ASP.NET MVC框架中,将视图中的数据传递到控制器中,主要通过发送表单实现的.具体使用中,主要使用以下三种方法.

1、通过Request.Form读取表单数据
2、通过FormCollection读取表单数据
3、直接读取表单数据对象

下边是我学习这些东西时的一点总结
1、通过Request.Form读取表单数据
首先定义一个Person类如下:
public class Person
{
public string FirstName { get; set; }
public string LastName { get; set; }
}
复制代码

在HomeController中定义如下方法,用于接收View传来的数据:

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult RequestForm()
{
Person person = new Person();
person.FirstName = Request.Form["FirstName"];
person.LastName = Request.Form["LastName"];
return View(person);
}
复制代码

这个方法通过Request.Form分别读取View传来的两个文本框"FirstName"和"LastName"中的数据,然后得到Person类实例化对象person.这些数据是HomeView传来的.实现表单的代码如下:



<%using (Html.BeginForm("RequestForm", "Home"))
{%>
FirstName:<%=Html.TextBox("FirstName")%>

LastName:<%=Html.TextBox("LastName")%>


<%} %>



复制代码

其中:Html.BeginForm("RequestForm", "Home")是MVC中的FormExtensions类中的扩展方法.第一个参数指明接收表单的Action,第二个参数指明接受表单的Controller.这条语句指明了Home Controller中的Action RequestForm接受了刚才传递来的数据.发送的表单数据两个文本框:"FirstName"和"LastName"点击提交按钮Submit后的结果如下:



可以看到,对象person成功接收了表单传来的数据.

2、通过FormCollection读取表单数据
ASP.NET MVC中的FormCollection对象是提交的Form中所有对象的集合.
为了通过FormCollection读取表单数据,设置如下表单:



<%using (Html.BeginForm("FormCollection", "Home"))
{ %>
FirstName:<%=Html.TextBox("FirstName")%>

LastName:<%=Html.TextBox("LastName")%>



<%} %>



复制代码
(Writer的插入代码块功能突然就不能用了,郁闷中.....)



可以看出,处理表单的Action是HomeController中的FormCollection方法.发送的表单依然是来年改革文本框.



FormCollection方法的实现如下:





[AcceptVerbs(HttpVerbs.Post)]
public ActionResult FormCollection(FormCollection formCollection)
{
Person person = new Person();
person.FirstName = formCollection["FirstName"];
person.LastName = formCollection["LastName"];
return View(person);
}
复制代码
FormCollection类型是传入Form中窗体值的提供程序(MSDN里边这么说的,不是很理解).FormCollection()方法中传入了FormCollection类型的参数,该参数会自动绑定表单中的所有数据.
通过FormCollection可分别获取两个文本框中的数据,然后得到Person类的实例化对象person.结果如下:




3、直接读取表单数据对象
为直接读取表单对象,设置如下表单:



<%using (Html.BeginForm("Person", "Home"))
{ %>
FirstName:<%=Html.TextBox("FirstName")%>

LastName:<%=Html.TextBox("LastName")%>



<%} %>



复制代码
处理该表单的Action是HomeController中的Person方法.发送两个文本框中的数据.
Person() 的实现如下:

public class Person
{
public string FirstName { get; set; }
public string LastName { get; set; }
}
复制代码
在上述代码中,Person()方法中传入了Person类型参数,其内部读取了两个文本框中的"FirstName"和"LastName"中的数据,直接得到Person类的实例化对象person.
程序的运行结果如下:



直接读取表对象时,发送表单的文本框必须与数据对象属性的名称相一致(不区分大小写)

你可能感兴趣的:(asp.net,mvc)