ASP.NET 几种常用的页面传值的方式
1.Session
维护会话数据,会话就是给定用户与Web应用程序之间的交互。会话由HttpSessionState对象表示。为了维护一个特定用户的状态信息。可以使用
Controller类或者Global.asax中的Session属性
经典案例:在线购物车是必须按照用户去维护数据。
如果10个人全部登录到一个在线商场,每个个体都将有一组她(他)想要购买的项并且这个数据需要维护。
当新的用户登录到Web应用程序时,.NET运行库将自动给这个用户分配一个唯一的会话ID,用来识别这个用户。每个会话ID被分配一个自定义的HttpSessionState类型实例,以保存该用户的数据。
格式:
Session[“Name”]=“Value(Or Object)”;
在后台Controller控制器中使用:
HomeController.cs
public ActionResult Index()
{
//添加session
/*
Session 个人对话:存放在服务器端的状态,所有的视图中都保存某个数据,
服务器端对象,默认生命周期为20分钟
信息保存在服务器端,相对比较安全
*/
Session["user"] = new UserModel() { Id=15000, UserName = "jack",PassWord="jiao7060158",Address="XuZhou"};
string sessionId = Session.SessionID;
//Session.Remove("user");//移除指定name的session
//Session.Abandon();//取消当前的session
//Session.Clear();//清除所有的session
//真正部署时ISS和配置文件中都需要配置
Session.Timeout = 30;//设置session的失效时间,以分钟为单位
return View();
}
Index()动作方法对应的View视图Index.cshtml:
在该视图中,实现点击产品首页链接,进行跳转,
在Product页面接收传递的参数
@{
Layout = null;
}
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width" />
<title>首页</title>
</head>
<body>
<div>
<a href="/Product/Index" target="_blank">产品首页</a>
</div>
</body>
</html>
ProductController.cs控制器:
public class ProductController : Controller
{
// GET: Product
public ActionResult Index()
{
return View();
}
}
对应的视图Index.cshtml:
@{
Layout = null;
}
@*
在前台页面引入命名空间
*@
@using MVC_Project02.Models;
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width" />
<title>产品首页</title>
</head>
<body>
@{
//在前台页面获取传递的参数
UserModel user = Session["user"] as UserModel;
}
<div class="product">
<p>@user.UserName,欢迎来到产品列表页面</p>
</div>
</body>
</html>
Result:
优点:1.使用简单,不仅能传递简单数据类型,还能传递对象。
2.数据量大小是不限制的。
缺点:1.在Session变量存储大量的数据会消耗较多的服务器资源。
2.容易丢失。
使用方法:1**.在源页面的代码中创建你需要传递的名称和值构造Session变量**:Session[“Name”]=“Value(Or Object)”;
2.在目的页面的代码使用Session变量取出传递的值。Result = Session[“Nmae”]
注意:
session不用时可以销毁它,销毁的方法是:
清除一个:Session.Remove(“session名”);
清除所有:Session.Clear();
2.Cookie:
在Cookie内保存数据,它总是在用户的计算机上呈现为一个文本文件。当用户登录到一个给定站点时,浏览器会检查用户的机器是否有相应的url的cookie文件,如果有,会将这个数据追加到HTTP请求中。
然后负责接收的服务端网页就能够读取cookie数据,创建一个可能适合当前用户偏好的GUI。
在ProductController.cs控制器中添加存储cookie的代码:
//cookie客户端对象 字符串类型
HttpCookie cookie = new HttpCookie("name");
cookie.Expires = DateTime.Now.AddMinutes(10);//设置过期时间
//cookie.Expires = DateTime.Now.AddSeconds(10);
cookie.Value = "simon";
Response.AppendCookie(cookie);//将cookie添加到服务器端响应中,输出到客户端(浏览器)
//Response.Cookies.Add(cookie);
在前台页面获取cookie值:
@{
//在前台页面获取传递的参数
UserModel user = Session["user"] as UserModel;
string name=string.Empty;
if (Request.Cookies["name"] !=null) {
//在前台页面使用request对象读取指定名称的cookie值
name = Request.Cookies["name"].Value;
}
}
<p>Name: @name</p>
Result:
总结:
Cookie用于在用户浏览器上存储小块的信息,保存用户的相关信息,比如用户访问某网站时用户的ID,用户的偏好等,用户下次访问就可以通过检索获得以前的信息。所以Cookie也可以在页面间传递值。Cookie通过HTTP头在浏览器和服务器之间来回传递的。Cookie只能包含字符串的值,如果想在Cookie存储整数值,那么需要先转换为字符串的形式。
与Session一样,其是针对每一个用户而言的,但是有个本质的区别,即Cookie是存放在客户端的,而session是存放在服务器端的。而且Cookie的使用要配合ASP.NET内置对象Request和Response来使用。
优点:
1.使用简单,是保持用户状态的一种非常常用的方法。
比如在购物网站中用户跨多个页面表单时可以用它来保持用户状态。
缺点:
1.常常被人认为用来收集用户隐私而遭到批评。
2.安全性不高,容易伪造。
3.Application:
在ASP.NET下,应用程序状态由HttpApplicationState类型的实例维护。使你可以在所有登录到ASP.NET应用程序的用户(和所有页面)之间分享全局信息。
在Controller控制器中,可以使用Controller这个web类的 HttpContext属性获取HTTP上下文对象,再使用 HttpContext对象的Application属性来设置全局数据
/*
使用application对象存储数据
存储在服务器端,安全状态 共享状态
*/
//HTTP上下文对象
HttpContext.Application["count"] = 10;//全局的数据
在前台页面获取application对象存储的数据:
@{
Layout = null;
}
@*
在前台页面引入命名空间
*@
@using MVC_Project02.Models;
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width" />
<title>产品首页</title>
</head>
<body>
@{
//在前台页面获取传递的参数
UserModel user = Session["user"] as UserModel;
//lock和unlock方法用来锁定和解锁,为了防止并发修改
HttpContext.Current.Application.Lock();
//获取在application对象中存储的数据
int count= Convert.ToInt32(HttpContext.Current.Application["count"]);
HttpContext.Current.Application.UnLock();
string name=string.Empty;
if (Request.Cookies["name"] !=null) {
name = Request.Cookies["name"].Value;//在前台页面使用request对象读取指定名称的cookie值
}
}
<div class="product">
<p>@user.UserName,欢迎来到产品列表页面</p>
<p>当前登录人数: @count</p>
<p>Name: @name</p>
</div>
</body>
</html>
Result:
Application对象的作用范围是整个全局,也就是说对所有用户都有效。它在整个应用程序生命周期中都是有效的,类似于使用全局变量一样,所以可以在不同页面中对它进行存取。它和Session变量的区别在于,前者是所有的用户共用的全局变量,后者是各个用户独有的全局变量。
可能有人会问,既然所有用户都可以使用application变量,那他可以用在什么场合呢?这里举个例子:网站访问数。多个请求访问时都可以对它进行操作。
优点:
1.使用简单,消耗较少的服务器资源。
2.不仅能传递简单数据,还能传递对象。
3.数据量大小是不限制的。
缺点:
1.作为全局变量容易被误操作。所以单个用户使用的变量一般不能用application。
使用方法:
1.在源页面的代码中创建你需要传递的名称和值构造Application变量:Application[“Name”]=“Value(Or Object)”;
2.在目的页面的代码使用Application变量取出传递的值。Result = Application[“Name”]
注意:
常用lock和unlock方法用来锁定和解锁,为了防止并发修改。
4.QueryString方式获取参数:
使用Request对象获取url?后的参数:
浏览器请求路径:如:/CheckLogin?username=jane&&password=jiao7060158
如:
1.页面跳转,也是向服务器端发送请求
在a标签的href属性中的url,附加的请求参数
2.form表单数据的get请求方式
注意:只能接收get请求数据
控制器中获取请求参数值:
//只能接收get请求数据
string username = Request.QueryString["username"];
string password = Request.QueryString["password"];
Demo:
UserController.cs控制器:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using MVC_Project02.Models;
namespace MVC_Project02.Controllers
{
public class UserController : Controller
{
// GET: User
public ActionResult Login()
{
return View();
}
public ActionResult CheckLogin(UserModel userModel)
{
//在后台获取前端用户请求参数
/*
页面跳转,也是向服务器端发送请求
如:在a标签的href属性中的url,附加的请求参数
*/
username = Request.QueryString["username"];//只能接收get请求数据
password = Request.QueryString["password"];
return View("../Home/Index");//注意:跨路由的路径问题
}
}
}
Login动作方法对应的View视图Login.cshtml
@{
Layout = null;
}
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width" />
<title>登录页面</title>
</head>
<body>
<div>
@*
url传参:使用"?"和"&&"拼接参数
*@
<a href="/User/CheckLogin?username=jane&&password=jiao7060158" target="_blank">首页</a><br />
@*
路由传参:
使用前提:需要根据传递的参数的形式,先在RouteConfig.cs文件中,配置对应格式的路由规则
*@
<a href="/User/CheckLogin/Lara/lara894656" target="_blank">首页</a><br />
<form class="loginform" action="/User/CheckLogin" method="get">
用户名:<input type="text" name="username" id="username" /> <br />
密码: <input type="password" name="password" id="password" /><br />
<input type="submit" value="提交" />
</form>
</div>
</body>
</html>
点击超链接或者填写表单数据后,提交表单数据,都将跳转到CheckLogin页面,在
CheckLogin动作方法中,获取请求参数。
Result:
但是如果改为post请求方式:
获取不到数据
可以将传送的值显示在浏览器的地址栏中。如果是传递一个或多个安全性要求不高或是结构简单的数值时,可以使用这个方法。但是对于传递数组或对象的话,就不能用这个方法了。
优点:
1.使用简单,对于安全性要求不高时,传递数字或是文本值非常有效。
缺点:
1.缺乏安全性,由于它的值暴露在浏览器的URL地址中的。
2.不能传递对象。