背景:我被要求处理遗留的asp.net应用程序,该应用程序没有文档,原始程序员无法进行咨询.我主要是一个Perl程序员,主要是在*nix系统上,所以虽然我对系统的实际逻辑没有重大问题,但我会被下面的一些"裸骨"东西束缚在一起.
大纲:我正在尝试扩展现有的aspx表单以增加其功能,该表单是购买电话号码系统的一部分.此时,首次调用时的表单会在HTML下拉列表中显示位置列表和电话区号,并希望用户选择一个.当选择一个值(或选择并单击选择按钮,如果禁用JS)并提交表单时,回发模式下的页面将提供适当的重定向到购买页面,并在查询字符串中设置各种值.我想通过在同一表单上添加第二行控件来扩展功能,包括用户输入区号的文本框和"搜索"按钮.这个想法是,当用户这样做时,系统将对该区域代码进行数据库搜索,如果找到匹配,生成适当的重定向到销售该区域的页面.所有代码都是(并将在)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>
Run Code Online (Sandbox Code Playgroud)
我希望能够将这些变量拉回来
Button2_Clicked = Request.Form["Button2"]
STD_Code_Search = Request.Form["STD_Code_Search"]
Run Code Online (Sandbox Code Playgroud)
但是没有任何事情发生过.基于更多搜索,我发现此代码显示进入表单的所有变量:
foreach(string key in Request.Form.Keys)
{
LOG.WriteLine(key + ": " + Request.Form[key] + "<br/>");
}
Run Code Online (Sandbox Code Playgroud)
LOG对象是一个StreamWriter转到文本文件,似乎工作正常.
但是文件中的数据如下所示:
ctl00$ctl00$ctl00$ContentPlaceHolder1$Main$Range_Data$STD_Code_Search: 01952<br/>
ctl00$ctl00$ctl00$ContentPlaceHolder1$Main$Range_Data$Button2: Search<br/>
Run Code Online (Sandbox Code Playgroud)
很公平,然后我尝试使用以下内容来检索C#中的数据
STD_Search = Request.Form["ctl00$ctl00$ctl00$ContentPlaceHolder1$Main$Range_Data$STD_Code_Search"];
Run Code Online (Sandbox Code Playgroud)
这确实有效,如果我将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"];
Run Code Online (Sandbox Code Playgroud)
然后,虽然asp.net进程似乎都正确完成(没有错误或页面崩溃),但文本文件的写入停止并且根本没有写入任何数据.
问题:
我确定我不应该包含所有占位符的东西(在这里阅读我收集到的是底层框架的一部分,而asp实际上应该只提供命名变量,就像Perl或PHP系统一样有一个简单的HTML表单),任何关于为什么可能发生的指针,以及我应该做什么来处理/提取数据?
当我尝试读取第二个变量时,为什么这一切都会消失,尽管我只读了一个工作(对于一些大的工作值)?
是否有关于asp.net和C#的推荐书籍?我有Sitepoint的"使用C#和VB构建你自己的asp.net 4网站",这对于尝试将别人的代码分开并重新构建它有所帮助.
之前的研究:我已经对此进行了广泛的搜索,但是到目前为止我看到的大多数答案都与使用asp.net处理从外部站点提交的数据等的人或者直接使用post的脚本有关.我在asp.net上看过教程的所有网站似乎都说我应该使用Request.Form ["variable_name"],所以这里似乎还有其他东西.
您应该使用代码隐藏来完成所有这些事情。这会让事情变得更容易。
string searchText = STD_Code_Search.Text;
Run Code Online (Sandbox Code Playgroud)
要知道是否单击了按钮,您可以这样做
<asp:Button ID="Button2" runat="server" Text="Search" OnClick="Button2_Click" />
Run Code Online (Sandbox Code Playgroud)
并进行处理
protected void Button2_Click(object sender, EventArgs e)
{
//button2 was clicked
}
Run Code Online (Sandbox Code Playgroud)
Asp.Net 是一个事件驱动的框架,与 PHP 或 JSP 不同。选择一本关于 Asp.Net 的好书并阅读。Asp.Net 已经为您处理了您尝试做的大部分事情。