在Webforms之间发送变量



我正在尝试制作一个新闻网站,我想使新闻标题移动,一旦用户将鼠标放在标题上,它将停止,如果点击它,它将打开此新闻并显示标题,详细信息和新闻照片。

我做了一个名为Site1的主页。Master和我制作了两个WebForm2内容页面,显示移动新闻标题,并使用变量x将id发送给WebForm3。然而,一旦我点击任何新闻,它不会显示任何内容。

WebForm2.aspx

<%@ Page Title="" Language="C#" MasterPageFile="~/Site1.Master" AutoEventWireup="true" CodeBehind="WebForm2.aspx.cs" Inherits="newsSite.WebForm2" %>
<asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" runat="server">
<div id="n" runat="server">
</div>
</asp:Content>

WebForm2.aspx.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data.SqlClient;
namespace newsSite
{
public partial class WebForm2 : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
SqlConnection cn = new SqlConnection("server=;uid=sa;pwd=;database=news");
cn.Open();
SqlCommand cm = new SqlCommand("select id,title from articles", cn);
SqlDataReader dr = cm.ExecuteReader();
string strTitle = "";
while (dr.Read())
strTitle += " <a herf=WebForm3.aspx?x="+dr["id"]+">"+ dr["title"] + "</a> &nbsp;&nbsp;&nbsp;";
n.InnerHtml = "<marquee id=news onmouseover=news.stop(); onmouseout=news.start();>" + strTitle + "</marquee>";
}
}
}

<%@ Page Title="" Language="C#" MasterPageFile="~/Site1.Master" AutoEventWireup="true" CodeBehind="WebForm3.aspx.cs" Inherits="newsSite.WebForm3" %>

<asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" runat="server">
<div id="art" runat="server">
</div>
</asp:Content>

WebForm3.aspx.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data.SqlClient;
namespace newsSite
{
public partial class WebForm3 : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
SqlConnection cn = new SqlConnection("server=;uid=sa;pwd=;database=news");
cn.Open();
SqlCommand cm = new SqlCommand("select * from articles where id=" + Request.Params["x"], cn);
SqlDataReader dr = cm.ExecuteReader();
while (dr.Read())
{
art.InnerHtml += "<b>" + dr["Title"] + "</br><br>";
art.InnerHtml +=  dr["Details"] + "<br>";
art.InnerHtml += "<img src=images/" + dr["photo"]+ " /><br>";
}
}
}
}

这是一个很好的问题。

为什么使用ViewState超过session()?

好,首先我们使用Session()。这对每个用户都是持久的,对每个用户都是全局的,并且是100%的服务器端(因此,它被认为是安全的)。

请记住,如果您不使用SQL server托管会话,那么这些值很容易被破坏。但是,session[]是传递值的好方法。

但是,第一名是什么?好吧,因为session是全局的,假设我们在一个房子列表上,我点击一行(比如买房子)。好了,我们现在跳转到一个新的页面,session()可以有那个房子的PK id。但是,如果我们右键单击,打开一个新标签呢?现在,您可以打开两个选项卡,每个选项卡显示一个不同的房子,但是我们的session()被设置为我们打开的最后一个。我们现在有可能买错房子!!

所以session()是针对每个用户的,而不是针对每个页面的。(天哪,真希望有人能花30秒把上面的信息写进去!!)

所以,session()对于全局值和传递值很好。

然而,对于行和数据库pk id的东西?然后,在页面加载时,您可以抓取并采用一个绑定标准,将该值传输到页面加载时的视图状态。这样,你就可以得到每一页…

这就把我们带到了ViewState。Viewstate不能真正用于传递值,但是Viewstate对于保存或保存当前页面的值非常有用。所以,ViewState是每个页面-这样你的代码不会搞砸,如果有人碰巧右键单击,或有两个浏览器运行。

下了吗?旧的考验和真实?

使用URL中的参数。我认为它们看起来很丑,但即使是这个网站(SO)也可以并且确实在URL中使用参数(通常称为查询参数)。

现在,您可以使用URL传递值,但对于敏感信息,或数据库PK值?(非常糟糕的主意)。我记得在互联网的早期,一些信用卡系统使用带有id的URL。如果你输入不同的ID,你可以看到其他人的信用卡信息!!

但是,即使是谷歌,这个网站和许多仍然使用参数。他们这样做,因为这可以减少服务器端的负载和内存(信息在URL客户端)。

然而,还有一个非常好的选项,叫做Page,很少使用。.net前情回顾。

这意味着你实际上可以引用、抓取、获取或使用上一页的任何东西。然而,要使其工作需要两个条件:

您使用的按钮需要使用post-back URL。

你必须在第一页加载IsPostBack = false.

然而,这一点经常被忽略,并且能够在不使用任何其他方法的情况下从前一页获取任何值和任何控件经常被忽视。如前所述,您必须在第一个页面加载时获取值,但所有值都来自page。PrevousPage可以这样得到。如前所述,只有当使用的按钮具有Postbank URL时,previoupage才有效。

所以我经常在一个简单的类中设置一堆值。我使用ViewState持久化它。为了传递另一个页面,我把它塞进session(),在第一个页面加载时,这个类现在移动到viewstate(允许并处理右击,并打开多个页面/浏览器)。

这可以使用各种状态管理技术来实现,如视图状态、会话状态、应用程序状态和回发功能

ASP。. NET状态管理

状态管理

您可以使用会话变量将值从表单发送到另一个表单,或从页面发送到另一个表单。这里有一个例子下面是一个会话使用的示例:

Session["user"] = txtName.Text;
Session["id"] = 1;
List<string> colors = new List<string>();
colors.Add("red");
colors.Add("green");
colors.Add("blue");
Session["colors"] = colors;
colors = null;
Response.Redirect("RetrieveData.aspx");
The following sample of how to retrieve a Session value:
if (Session["user"] != null)
{
lbl3.Text = Session["user"].ToString();
}
if (Session["colors"] != null)
{
List<string> col = new List<string>();
col = (List<string>) Session["colors"];
foreach (var item in col
{
lbl3.Text += " " + item + ", ";
}
col = null;
}

你可以找到更多关于会话变量的细节&此链接上的其他方法

相关内容

  • 没有找到相关文章

最新更新