6

背景:我被要求处理一个遗留的 asp.net 应用程序,该应用程序没有文档,原始程序员也无法咨询。我主要是一个 Perl 程序员,主要是在 *nix 系统上,所以虽然我对系统的实际逻辑没有什么大问题,但我被下面的一些“裸露的骨头”东西缠住了。

大纲: 我正在尝试扩展现有的 aspx 表单以增加其功能,该表单是购买电话号码系统的一部分。目前,第一次调用的表单在 HTML 下拉列表中显示位置和电话区号列表,并希望用户选择一个。When a value is selected (or selected and the select button clicked, if JS is disabled) and the form submitted, the page in postback mode then provides an appropriate redirect to a purchase page, with various values set in the query string. 我想通过在同一个表单上添加第二行控件来扩展功能,包括一个供用户输入区号的文本框和一个“搜索”按钮。这个想法是,当用户这样做时,系统将对该区号进行数据库搜索,如果找到匹配项,生成适当的重定向到销售该区域的页面。所有代码都是(并且将是)在 C# 中。

问题:在 Stack Overflow 上找到了很多关于从 asp.net 表单中提取表单变量的有用信息后,我尝试使用 Request.form["variable_name"] 检索我的新变量。但很快就清楚这些价值观并没有通过。

这是表单新位的 aspx 页面代码:

<tr>
    <td align='left'><b>STD code:</b></td>
    <td align='left'>
        <asp:TextBox id="STD_Code_Search"
             AutoPostBack="True"
             Columns="7"
             Text=""
             TextMode="SingleLine"
             Wrap="False"
             runat="server"/>
    </td>
        <td><asp:Button ID="Button2" runat="server" Text="Search" /></td>
</tr>

我希望能够通过

Button2_Clicked = Request.Form["Button2"]
STD_Code_Search = Request.Form["STD_Code_Search"]

然而,什么都没有发生。根据更多搜索,我发现这段代码可以显示表单中的所有变量:

    foreach(string key in Request.Form.Keys)
    {
        LOG.WriteLine(key + ": " + Request.Form[key] + "<br/>");
    }

LOG 对象是一个 StreamWriter 去一个文本文件,这似乎工作正常。

但是文件中的数据如下所示:

ctl00$ctl00$ctl00$ContentPlaceHolder1$Main$Range_Data$STD_Code_Search: 01952<br/>
ctl00$ctl00$ctl00$ContentPlaceHolder1$Main$Range_Data$Button2: Search<br/>

很公平,然后我尝试使用以下内容来检索 C# 中的数据

STD_Search = Request.Form["ctl00$ctl00$ctl00$ContentPlaceHolder1$Main$Range_Data$STD_Code_Search"];

这确实有效,如果我将 STD_Search 发送到 StreamWriter LOG,我可以在我的文本文件中看到输入的值。

但是,如果我然后尝试读取第二个值(在这种情况下,我试图捕获 Button2 的值,因此如果单击该按钮而不是原始按钮,我可以触发特定行为),使用以下代码:

STD_Search = Request.Form["ctl00$ctl00$ctl00$ContentPlaceHolder1$Main$Range_Data$STD_Code_Search"];
Button2_Clicked = Request.Form["ctl00$ctl00$ctl00$ContentPlaceHolder1$Main$Range_Data$Button2"];

然后,虽然 asp.net 进程似乎都正确完成(没有错误或页面崩溃),但文本文件的写入停止了,并且根本没有写入任何数据。

问题

  1. 我确定我不应该包含所有占位符的东西(继续阅读,我认为这是底层框架的一部分,asp 实际上应该只向我提供命名变量,就像 Perl 或 PHP 系统一样使用纯 HTML 表单),是否有任何关于为什么会发生这种情况以及我应该做些什么来处理/提取数据的指针?

  2. 为什么当我尝试读入第二个变量时,尽管我只读入一个变量(对于一些大的工作值)工作,但它都死了?

  3. 有推荐的asp.net和C#书籍吗?我有 Sitepoint 的“使用 C# 和 VB 构建您自己的 asp.net 4 网站”,它有所帮助,但对于尝试将其他人的代码拆开并重新构建它并不是那么有用。

先前的研究:我对此进行了广泛的搜索,但是到目前为止,我看到的大多数答案都与使用 asp.net 处理从外部站点等提交的数据或通过脚本直接使用 post 提交的数据有关。我在 asp.net 上查看的所有教程网站似乎都说我应该只使用 Request.Form["variable_name"],所以这里似乎还有其他事情发生。

4

3 回答 3

3

您应该使用代码隐藏来完成所有这些工作。这会让事情变得更容易。

string searchText = STD_Code_Search.Text;

要知道是否单击了按钮,您会这样做

<asp:Button ID="Button2" runat="server" Text="Search" OnClick="Button2_Click" />

并进行处理

protected void Button2_Click(object sender, EventArgs e)
{
    //button2 was clicked
}

Asp.Net 是一个事件驱动的框架,与 PHP 或 JSP 不同。在 Asp.Net 上选择一本好书并阅读。Asp.Net 已经为您处理了您尝试做的大部分事情。

于 2012-11-12T18:25:02.457 回答
1

Request.Form集合仅在您想直接访问“原始”POST 正文内容时使用。ASP.NET WebForms 运行一个抽象层,这意味着您通常不需要使用此集合。

而是通过其父控件访问提交的值。在这种情况下,该控件称为“STD_Code_Search”(严重违反 .NET 的命名和样式约定,但我离题了)。假设您正在使用 Visual Studio 的工具,将会有一个自动生成的文件与您的 *.aspx 文件同名,后缀为“designer.cs”,其中包含一个名为“ protected TextBox STD_Code_Search;”的类字段。您需要做的就是访问此字段。请注意,此字段只会在Init页面事件之后填充。

string search = STD_Code_Search.Text;
于 2012-11-12T18:26:48.193 回答
0

你试过它应该如何工作吗?

.cs 文件中的每个表单控件都应该有一个受保护的变量。较新版本的 Visual Studio 会为您执行此操作(当您添加服务器端标记标签时),但基本上如果您在 .cs 文件中没有用于变量 .g 的智能感知。

STD_Code_Search

如果未声明,只需在页面顶部执行此操作:

protected TextBox STD_Code_Search;

现在当你回帖时STD_Code_Search.Text 应该有一个值

正如我所说,它应该如何工作。

除非有一些令人信服的理由使用 Request.Form 你不应该去那里,但值得知道它写在客户端的“名称”属性中的任何内容(因此是可怕的占位符内容)。它可以被覆盖为更漂亮的东西(基于您的 asp.net 版本的选项)。

于 2012-11-12T18:25:30.820 回答