【问题标题】:Http request issue in ASP.NetASP.Net 中的 Http 请求问题
【发布时间】:2011-03-20 10:40:49
【问题描述】:

我正在使用 C# + VS2008 + .Net 3.5 + ASP.Net + IIS 7.0 + ADO.Net + SQL Server 2008。我想开发一个具有以下功能的 ASP.Net aspx 页面,

1 可以接受3个Url参数param1、param2、param3,请求是这样的,

http://example.org/foo.aspx?parame1=abc&param2=def&param3=ghi

2 当页面响应客户端浏览器时,我想在结果html页面附近显示一个文本输入和一个提交按钮,文本输入的值与param1相同,在此示例中,将显示abc在文本框中,在浏览器地址栏中,我要保留原来的长urlhttp://example.org/foo.aspx?parame1=abc&param2=def&param3=ghi

3 当用户更改文本输入中的值并单击提交按钮时,我想再次将此请求发送到 foo.aspx,并将 param1 值更改为用户在文本输入中输入的值,同时时间,保持 parame2 和 param3 的值与上次请求的响应相同。例如,当用户请求http://example.org/foo.aspx?parame1=abc&param2=def&param3=ghi时,页面显示,当用户将文本输入从abc更改为google时,新的请求将是http://example.org/foo.aspx?parame1=google&param2=def&param3=ghi

有参考样本吗?我的问题是我不知道如何在一个aspx页面中实现这么多功能。

【问题讨论】:

  • 你试过<form ... method="get">...吗?当然,将您的输入命名为param1
  • 如何解决?请给我看一个完整而简单的示例吗?

标签: c# asp.net .net visual-studio-2008 iis-7


【解决方案1】:

如果您希望浏览器地址栏显示更新后的 URL,您可以允许单击按钮回发到服务器,然后处理文本框的 TextChanged 事件。

在 TextChanged 事件处理程序中,您使用更改后的查询字符串参数构建新 URL,并使用 Response.Redirect 将浏览器重定向到新 URL。

这里有一个简单的例子。

给定一个带有文本框和按钮的 ASPX 页面,类似这样的

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="WebApplication1._Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
  <title></title>
</head>
<body>

  <script type="text/javascript">
    function requery() {
      var query = location.search.substring(1);
      var pairs = query.split("&");
      var param1Value = document.getElementById("txtParam1").value;

      url = "/Default.aspx?param1=" + param1Value;
      for (var i = 0; i < pairs.length; ++i) {
        var pair = pairs[i];
        if ((pair.indexOf("param1") != 0) && (pair.length > 0)) {
          url += "&" + pair;
        }
      }
      location.href = url;
    }
  </script>

  <form id="form1" runat="server">
  <div>
    <asp:TextBox ID="txtParam1" runat="server" OnTextChanged="txtParam1_TextChanged"></asp:TextBox>
    <asp:Button ID="Button1" runat="server" Text="Submit" />
    <input type="button" value="Client Action" onclick="requery()" />
  </div>
  </form>
</body>
</html>

您处理文本框的 TextChanged 事件的代码可以执行以下操作。

using System;
using System.Text;

namespace WebApplication1
{
  public partial class _Default : System.Web.UI.Page
  {
    protected void Page_Load(object sender, EventArgs e)
    {
      if (!IsPostBack)
      {
        txtParam1.Text = Request.QueryString["param1"];
      }
    }

    protected void txtParam1_TextChanged(object sender, EventArgs e)
    {
      // Build the new URL with the changed value of TextBox1      
      StringBuilder url = new StringBuilder();
      url.AppendFormat("{0}?param1={1}",
        Request.Path, txtParam1.Text);

      // Append all the querystring values that where not param1 to the
      // new URL
      foreach (string key in Request.QueryString.AllKeys)
      {
        if (string.Compare(key, "param1", true) != 0)
        {
          url.AppendFormat("&{0}={1}", key, Request.QueryString[key]);
        }
      }

      // Redirect the browser to request the new URL
      Response.Redirect(url.ToString());
    }
  }
}

【讨论】:

  • @George2,保留原来的两个参数是什么意思。我提供的示例应该在 URL 上保留 param2 和 param3。至于两个 Page_Load 事件,这是意料之中的。第一个是响应按钮的 PostBack 事件,第二个是响应浏览器重定向到新 URL(这是一个 GET 所以 IsPostBack == false),这是具有新参数的相同目标页面。
  • @George2,我相信我已经在第一条评论中回答了这个问题。我引用“至于两个 Page_Load 事件,这是预期的。第一个是响应按钮的 PostBack 事件,第二个是响应浏览器重定向到新 URL(这是一个 GET 所以 IsPostBack == false ),也就是新参数的同一个目标页面"
  • @George2,另一种方法是在客户端使用 javascript 在按钮单击时构建新 URL(这将在客户端事件而不是服务器端事件上处理)和然后将 Window.Location 更改为新的 URL。在这里查看有关 Window.Location 的更多信息:w3schools.com/jsref/met_loc_replace.asp
  • @George2,我会试着找个时间整理一个样本。但是你不会为按钮使用服务器端控件,因为你想处理这个客户端。
  • @George2,我用一个快速而肮脏的 javascript 函数和一个调用该函数的客户端按钮更新了 ASPX 代码。因此,您现在有了一个简单的示例,说明如何在客户端和服务器端执行此操作。 JS 可能可以改进,这不是我经常使用的东西,所以我只是使用了基本功能,但它应该可以工作。
猜你喜欢
  • 2017-04-22
  • 1970-01-01
  • 1970-01-01
  • 2011-06-12
  • 2015-09-13
  • 1970-01-01
  • 1970-01-01
  • 2011-11-09
相关资源
最近更新 更多