33

我正在尝试提高我的门户网站的性能。我正在使用 Session 来存储状态信息。

但我听说使用 session 会降低应用程序的速度。有没有其他方法可以在 asp.net 中跨页面传递值。

4

5 回答 5

61

您可以通过以下方式将值从一页传递到另一页..

Response.Redirect
Cookies
Application Variables
HttpContext

响应.重定向

放 :

Response.Redirect("Defaultaspx?Name=Pandian");

得到 :

string Name = Request.QueryString["Name"];

饼干

放 :

HttpCookie cookName = new HttpCookie("Name");
cookName.Value = "Pandian"; 

得到 :

string name = Request.Cookies["Name"].Value;

应用程序变量

放 :

Application["Name"] = "pandian";

得到 :

string Name = Application["Name"].ToString();

请参阅此处的完整内容:将值从一个传递到另一个

于 2013-02-19T11:21:44.687 回答
29

有多种方法可以实现这一目标。我可以简要地向您解释一下我们在日常编程生命周期中使用的 4 种类型。

请通过以下几点。

1 查询字符串。

FirstForm.aspx.cs

Response.Redirect("SecondForm.aspx?Parameter=" + TextBox1.Text);

SecondForm.aspx.cs

TextBox1.Text = Request.QueryString["Parameter"].ToString();

当您传递整数类型的值或其他短参数时,这是最可靠的方法。如果在通过查询字符串传递值时在值中使用任何特殊字符,则此方法更先进,则必须在将值传递到下一页之前对值进行编码。所以我们的代码片段将是这样的:

FirstForm.aspx.cs

Response.Redirect("SecondForm.aspx?Parameter=" + Server.UrlEncode(TextBox1.Text));

SecondForm.aspx.cs

TextBox1.Text = Server.UrlDecode(Request.QueryString["Parameter"].ToString());

网址编码

  1. Server.URLEncode
  2. HttpServerUtility.UrlDecode

2.通过上下文对象传递值

通过上下文对象传递值是另一种广泛使用的方法。

FirstForm.aspx.cs

TextBox1.Text = this.Context.Items["Parameter"].ToString();

SecondForm.aspx.cs

this.Context.Items["Parameter"] = TextBox1.Text;
Server.Transfer("SecondForm.aspx", true);

请注意,我们正在使用 Server.Transfer 而不是 Response.Redirect 导航到另一个页面。我们中的一些人还使用 Session 对象来传递值。在该方法中,值存储在 Session 对象中,然后从第二页中的 Session 对象中取出。

3. 将表单发布到另一个页面而不是 PostBack

通过将页面发布到另一个表单来传递值的第三种方法。这是一个例子:

FirstForm.aspx.cs

private void Page_Load(object sender, System.EventArgs e)
{
   buttonSubmit.Attributes.Add("onclick", "return PostPage();");
}

我们创建了一个 javascript 函数来发布表单。

SecondForm.aspx.cs

function PostPage()
{
   document.Form1.action = "SecondForm.aspx";
   document.Form1.method = "POST";
   document.Form1.submit();
}
TextBox1.Text = Request.Form["TextBox1"].ToString();

在这里,我们将表单发布到另一个页面而不是它本身。使用此方法,您可能会在第二页中看到视图状态无效或错误。处理这个错误就是把EnableViewStateMac=false

4.另一种方法是通过添加控件的PostBackURL属性进行跨页回发

在 ASP.NET 2.0 中,微软通过为跨页回发添加控件的 PostBackURL 属性解决了这个问题。实现是设置一个控制属性的问题,你就完成了。

FirstForm.aspx.cs

<asp:Button id=buttonPassValue style=”Z-INDEX: 102″ runat=”server” Text=”Button”         PostBackUrl=”~/SecondForm.aspx”&gt;</asp:Button>

SecondForm.aspx.cs

TextBox1.Text = Request.Form["TextBox1"].ToString();

在上面的示例中,我们分配按钮的 PostBackUrl 属性,我们可以确定它将发布到的页面而不是其本身。在下一页中,我们可以使用 Request 对象访问上一页的所有控件。

您还可以使用 PreviousPage 类来访问上一页的控件,而不是使用经典的 Request 对象。

第二窗体.aspx

TextBox textBoxTemp = (TextBox) PreviousPage.FindControl(“TextBox1″);
TextBox1.Text = textBoxTemp.Text;

正如您所注意到的,这也是一个在页面之间传递值的简单而干净的实现。

参考:MICROSOFT MSDN WEBSITE

快乐编码!

于 2013-02-19T11:16:12.237 回答
3

如果它只是用于在页面之间传递值并且您只需要一个请求。采用Context.

语境

Context 对象为单个用户、单个请求保存数据,并且仅在请求期间持久保存。Context 容器可以保存大量数据,但通常用于保存小块数据,因为它通常通过 global.asax 中的处理程序为每个请求实现。提供 Context 容器(可从 Page 对象或使用 System.Web.HttpContext.Current 访问)来保存需要在不同 HttpModules 和 HttpHandlers 之间传递的值。它还可用于保存与整个请求相关的信息。例如,IBuySpy 门户在 global.asax 中的 Application_BeginRequest 事件处理程序期间将一些配置信息填充到此容器中。请注意,这只适用于当前请求期间;如果您需要下一个请求仍然存在的东西,请考虑使用 ViewState。从 Context 集合中设置和获取数据使用的语法与您已经看到的其他集合对象(如 Application、Session 和 Cache)的语法相同。这里展示了两个简单的例子:

// Add item to
Context Context.Items["myKey"] = myValue;

// Read an item from the
 Context Response.Write(Context["myKey"]);

http://msdn.microsoft.com/en-us/magazine/cc300437.aspx#S6

使用上述。如果您随后执行操作Server.Transfer,您在上下文中保存的数据现在将可用于下一页。您不必担心删除/整理这些数据,因为它仅适用于当前请求。

于 2013-02-19T11:20:12.723 回答
1

您可以将其分配给隐藏字段,并使用检索它

var value= Request.Form["value"]
于 2013-02-19T11:17:33.413 回答
1

您可以使用查询字符串将值从一个页面传递到另一个页面。

1.使用查询字符串传递值

 Response.Redirect("Default3.aspx?value=" + txt.Text + "& number="+n);

2.使用这些方法中的任何一种检索您想要的页面中的值..

方法1

    string v = Request.QueryString["value"];
    string n=Request.QueryString["number"];

方法2

      NameValueCollection v = Request.QueryString;
    if (v.HasKeys())
    {
        string k = v.GetKey(0);
        string n = v.Get(0);
        if (k == "value")
        {
            lbltext.Text = n.ToString();
        }
        if (k == "value1")
        {
            lbltext.Text = "error occured";
        }
    }

注意:方法 2 是最快的方法。

于 2013-02-19T11:22:25.583 回答