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.不能传递对象

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值