背景:我被要求处理一个没有文档的原始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>
我希望能够通过
取回这些变量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进程似乎都正确完成(没有错误或页面崩溃),但文本文件的写入停止并且根本没有写入任何数据。
问题:
我确信我不应该包含所有占位符的东西 (在这里阅读我收集到的是底层框架的一部分 实际上,asp应该只向我提供命名变量 与Perl或PHP系统相同,使用纯HTML格式),任何 指出为什么会发生这种情况以及是否存在任何问题 否则我应该做什么来处理/提取数据?
当我尝试读取第二个变量时,为什么它都会掉线, 尽管工作(对于一些大的工作价值),我只读 在一个?
是否有关于asp.net和C#的推荐书籍?我有 Sitepoint的“使用C#和VB构建您自己的asp.net 4网站”,其中 已经帮了一下,但对于试图接受某人并没有那么有用 别的代码分开并重新构建它。
之前的研究:我已经对此进行了广泛的搜索,但到目前为止我看到的大部分答案都与使用asp.net处理从外部网站提交的数据的人有关,等,或直接使用post的脚本。我在asp.net上看过教程的所有网站似乎都说我应该使用Request.Form [“variable_name”],所以这里似乎还有其他东西。
答案 0 :(得分: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。 Pick a good book on Asp.Net and read。您尝试做的大部分事情都是由Asp.Net为您处理的。
答案 1 :(得分: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;
答案 2 :(得分:0)
您是否尝试过假设的工作原理?
您的.cs文件中的每个表单控件都应该有一个受保护的变量。较新版本的visual studio为您执行此操作(当您添加服务器端标记标记时),但基本上如果您在.cs文件中没有变量.g。
的智能感知STD_Code_Search
如果没有声明,请在页面顶部执行此操作:
protected TextBox STD_Code_Search;
现在当你发回STD_Code_Search.Text
应该有一个值
正如我所说,它应该如何运作。
除非有一些令人信服的理由使用Request.Form,否则你不应该去那里,但是值得知道它在客户端的“name”属性中的任何内容(因此是可怕的占位符)。它可以被覆盖到更漂亮的东西(基于你的asp.net版本的选项)。