页面传值是我们经常遇到的问题,这个各种页面传值的方式。
一、Request.Form:
获取以POST方式提交的数据(接收Form提交来的数据);
使用方法:
/// <summary>
/// 获取以POST方式提交的数据(接收Form提交来的数据)
/// </summary>
/// <returns></returns>
[HttpPost]
public ActionResult Hellos() {
string fname=Request.Form["fname"];
string lname = Request.Form["lname"];
@ViewBag.fname = fname;
@ViewBag.lname = lname;
return View();
}
二、QueryString:
获取地址栏参数(以GET方式提交的数据)
传递一个或多个安全性要求不高或是结构简单的数值时,可以使用这个方法。但是对于传递数组或对象的话,就不能用这个方法了。
优点:使用简单,对于安全性要求不高时传递数字或是文本值非常有效。
缺点:1.缺乏安全性,由于它的值暴露在浏览器的URL地址中的。
2.不能传递对象。
使用方法:
[HttpGet]
public string Welcome() {
string name = Request.QueryString["name"];
return HttpUtility.HtmlEncode("hello:"+name);
}
三、Request.Params:
Request.Form和Request.QueryString包含两种方式(优先获取GET方式提交的数据),它会在QueryString、Form、ServerVariable中都按先后顺序搜寻一遍。
使用方法:
/// <summary>
/// Request:Request.Form和Request.QueryString包含两种方式(优先获取GET方式提交的数据),它会在QueryString、Form、 ServerVariable中都按先后顺序搜寻一遍。
/// </summary>
/// <returns></returns>
public ActionResult Welcome() {
string fname = Request.Params["fname"];
string lname = Request.Params["lname"];
ViewBag.fname = fname;
ViewBag.lname = lname;
return View();
}
四、 Request.Cookies:
检索Cookies 集合中的值,Cookies 集合同意用户检索在 HTTP 请求中发送的 cookie 的值。
Request.Cookies使用语法:Request.Cookies(cookie)[(key)|.attribute]
參数说明:
(1)CookieName:代表表示Cookie的名字,由用户自行命名。
(2)Key:是Cookie指定keyword。通过给Cookie指定keyword,可使Cookie拥有多个值。这样的Cookie称为带索引的Cookie。
(3)Attribute:此參数表示Cookies集合对象的属性,其最经常使用的属性主要是Expires(用于设置Cookies的过期日期)、Domain(用于设置Cookies的有效作用域名范围)。
使用方法:
/// <summary>
/// Request.Cookies方法能够检索Cookies 集合中的值,Cookies 集合同意用户检索在 HTTP 请求中发送的 cookie 的值。
/// </summary>
/// <returns></returns>
[HttpPost]
public ActionResult Hello()
{
string fname=Request.Cookies["fname"].ToString();
string lname = Request.Cookies["lname"].ToString();
@ViewBag.fname = fname;
@ViewBag.lname = lname;
return View();
}
五.Session:
Session即会话,是指一个用户在一段时间内对某一个站点的一次访问。
Session对象在.NET中对应HttpSessionState类,表示“会话状态”,可以保存与当前用户会话相关的信息。
Session对象用于存储从一个用户开始访问某个特定的aspx的页面起,到用户离开为止,特定的用户会话所需要的信息。用户在应用程序的页面切换时,Session对象的变量不会被清除。
(1).在web.config中配置Session
<sessionState mode="Off|InProc|StateServer|SQLServer"
cookieless="true|false"
timeout="number of minutes"
stateConnectionString="tcpip=server:port"
sqlConnectionString="sql connection string"
stateNetworkTimeout="number of seconds"
/>
(2).Session具有以下特点:
优点
●.Session中的数据保存在服务器端;
●.Session中可以保存任意类型的数据;
●.Session默认的生命周期是20分钟,可以手动设置更长或更短的时间。
●.Session是安全的、透明的。
缺点:
● 因为Session是保存在服务端的内存中的,随着客户端请求的增多,很有可能影响到性能。
● 在Web.conig中,sessionState节点的mode属性,如果设置为"StateServer"或"SQLServer",就必须为存储到Session中的对象打上[Serializable]。这样在存储、读取Session的时候,不断地序列化和反序列化,也会影响到性能。
使用方法:
/// <summary>
/// Session用于存储特定的用户会话所需的信息。在ASP.NET中代表了服务器与客户端之间的“会话”
/// </summary>
/// <returns></returns>
public ActionResult PostSession() {
Session["lname"] = "编程"; //注:Session的值为"编程",Session的类型是object所以可以赋任何类型。
Session["fname"] = "男孩";
string fname = Session["lname"].ToString(); //读取
string lname = Session["lname"].ToString();
Session.Timeout = 20; //默认的时间为30,手动设置为20分钟
return View();
}
[HttpPost]
public ActionResult ClearSession() {
Session["lname"] = null;
Session.Remove("lname"); //清除某一个session
Session["fname"] = null;
Session.Remove("fname");
Session.Clear(); //清除session中的缓存数据(不管缓存与数据库的同步)
Session.Abandon(); //清除所有Session
return Content("Session已经被清空");
}
六.Application:
Application状态是整个应用程序全局的。在ASP时代我们通常会在Application中存储一些公共数据,而ASP.NET中Application的基本意义没有变:在服务器内存中存储数量较少又独立于用户请求的数据。由于它的访问速度非常快而且只要应用程序不停止,数据一直存在,我们通常在Application_Start的时候去初始化一些数据,在以后的访问中可以迅速访问和检索。
特点:
●. 存储的物理位置。服务器内存。
●. 存储的类型限制。任意类型。
●. 状态使用的范围。整个应用程序。
●.存储的大小限制。任意大小。
●. 生命周期。应用程序开始的时候创建(准确来说是用户第一次请求某URL的时候创建),应用程序结束的时候销毁。
●.安全与性能。数据总是存储在服务端,安全性比较高,但不易存储过多数据。
●. 优缺点与注意事项。检索数据速度快,但缺乏自我管理机制,数据不会自动释放。
使用方法:
/// <summary>
/// Application状态是整个应用程序全局的。在ASP时代我们通常会在Application中存储一些公共数据,而ASP.NET中Application的基本意义没有变:在服务器内存中存储数量较少又独立于用户请求的数据。
/// 由于它的访问速度非常快而且只要应用程序不停止,数据一直存在,我们通常在Application_Start的时候去初始化一些数据,在以后的访问中可以迅速访问和检索。
/// </summary>
/// <returns></returns>
public ActionResult Getapplication() {
System.Web.HttpContext.Current.Application["lname"] = "热爱编程的男孩子"; //存值
System.Web.HttpContext.Current.Application["fname"] = "爱编程的男孩子";
string lname = System.Web.HttpContext.Current.Application["lname"].ToString(); //取值
string fname = System.Web.HttpContext.Current.Application["fname"].ToString();
return View();
}
七:ViewBag
特性:
●. ViewBag是一个动态类型变量(dynamic),这是C# 4.0引入的新特性,变量类型会在运行时进行解析。
●. ViewBag基本上是ViewData的包装,也是用来从Controller向View来传递值的。
●. ViewBag也只在当前的请求中有效。
●. 在重定向(redirection)后,ViewBag中存储的变量值将变为null
●. 因为ViewBag是动态类型,所以我们在取得其值时,不需要进行类型转换。
control:
/// <summary>
///ViewBag是 dynamic 动态类型。它会在程序执行的时候动态解析。
/// </summary>
/// <returns></returns>
public ActionResult GetViewBag() {
ViewBag.name = "ViewBag";
ViewBag.age = 8;
string[] Items = new string[] {"中国","美国", "英国" };
ViewBag.itemsA = Items;
return View();
}
View:
@{
ViewBag.Title = "GetViewBag";
}
<h2>GetViewBag</h2>
<p>name:@ViewBag.name</p>
<p>Age:@ViewBag.age</p>
<p>ViewBagUserCountry:</p>
@foreach (var items in ViewBag.ItemsA)
{
<p>@items</p>
}
ViewBag更适合从Controller向View传递复杂对象数据时使用, 因为取出存储在其中的数据变量时无需进行类型转换。
八:ViewData
●.ViewData是一个继承自ViewDataDictionary类的Dictionary对象。
●.ViewData用来从Controller向对应的View传递值。
●.ViewData的只在当前当前的请求中有效,生命周期和View相同,其值不能在多个请求中共享。
●.在重定向(redirection)后,ViewData中存储的变量值将变为null。
●.在取出ViewData中的变量值是,必须进行合适的类型转换(隐式或显式)和空值检查。
control:
public ActionResult GetViewData() {
ViewData["name"] = "ViewData";
ViewData["Age"] = 20;
Dictionary<string, string> country = new Dictionary<string, string>();
country.Add("china","中国");
country.Add("America", "美国");
country.Add("Japan","日本");
ViewData["country"] = country;
return View();
}
View:
@{
ViewBag.Title = "GetViewData";
}
<h2>GetViewData</h2>
<p>name:@ViewData["name"]</p>
<p>Age:@ViewData["Age"]</p>
@{
foreach (var item in ViewData["Country"] as Dictionary<string,string>)
{
<p>country: @item.Key;</p>
}
}
我在从ViewData中取出变量name时并没有对其进行类型转换,那时因为我们存储的是一个简单类型的变量值。如何取出复杂的数据,必须进行类型转换。
综上, ViewData更适合从Controller向View传递简单对象数据时使用。
ViewBag和ViewData区别:
●.ViewData是字典类型,赋值方式用字典方式,通过key值读取对应的value,ViewData[“myName”]
●.ViewData比ViewBag快,ViewBag比ViewData慢。
●.ViewData和ViewBag中的值可以互相访问,因为ViewBag的实现中包含了ViewData
九:TempDate
特性:
●.TempData是一个继承自TempDataDictionary类的字典对象,它默认情况下是基于Session存储机制之上的。(备注:你也可以让你的TempData基于其他存储机制之上, 我们可以提供我们自定义的ITempDataProvider来完成,具体可以参见:
Session-less Controllers and TempData in ASP.NET MVC)
●.TempData是用来在多个Actions或从当前请求向子请求, 页面发生了重定向(Redirection)时传递共享数据。
●.只有在目标视图(View)完全加载后才有效。
●.在取出TempData存储的变量值时,必须进行合适的类型转换(隐式或显式)和空值检查。
control:
/// <summary>
///DataDictionary的一个实体,保存在Session中,也是以键值对的结构存在。
/// </summary>
/// <returns></returns>
public ActionResult GetTempData() {
this.TempData["name"] = "Tempdata";
this.TempData["age"] = "20";
Dictionary<string, string> country = new Dictionary<string, string>();
country.Add("china", "中国");
country.Add("America", "美国");
country.Add("Japan", "日本");
this.TempData["Country"] = country;
return View();
}
View:
@{
ViewBag.Title = "GetTempData";
}
<h2>GetTempData</h2>
<p>@TempData["name"]</p>
<p>@TempData["age"]</p>
@{
foreach (var item in TempData["country"] as Dictionary<string,string>)
{
<p>@item.Key</p>
}
}