javascript - 如何通过单击主 WebForm 上的按钮来自动填充位于 WebForm2 上的 TextBox
问题描述
我正在制作一个asp.net 网站,我在主WebForm 上有一个按钮,它与WebForm2 超链接。打开的 WebForm2 是一个典型的联系表单,其中包含一些文本框、下拉列表和一个按钮,用于发送包含我输入的信息的电子邮件。但是因为我正在制作一个电子商务网站,这取决于在主 WebForm 上单击哪个按钮(在哪个产品上),我需要在 WebForm2 上自动填充包含“产品名称”的 TextBox。首先,我有一个在单击按钮时打开的 JavaScript 模态,我根据产品名称在 TextBox 上制作了具有不同值的独立表单,但我不知道如何使模态功能发送一个电子 -邮件,
所以我的问题是,如何使按钮自动填充包含产品名称的 WebForm2 上的 TextBox?
万一这很重要,在 WebForm2 上,向我发送电子邮件的代码是:
protected void button_Click(object sender, EventArgs e)
{
try
{
var from = "email";
var to = "secondemail";
const string Password = "password";
string mail_subject = txt_subject.Text.ToString();
string mail_message = "Your Name: " + txt_name.Text + "\n";
mail_message += "Your Surname: " + txt_surname.Text + "\n";
mail_message += "Your telephone number: " + txt_phone.Text + "\n";
mail_message += "Your address: " + txt_address.Text + "\n";
mail_message += "Your e-mail: " + txt_email.Text + "\n";
mail_message += "The product name: " + txt_product.Text + "\n";
mail_message += "Payment method: " + dropdownlist.SelectedValue + "\n";
var smtp = new SmtpClient();
{
smtp.Host = "smtp@mail";
smtp.Port = port;
smtp.EnableSsl = true;
smtp.DeliveryMethod = SmtpDeliveryMethod.Network;
smtp.Credentials = new NetworkCredential(from, Password);
smtp.Timeout = 20000;
}
smtp.Send(from, to, mail_subject, mail_message);
confirm.Text = "Thank you for your order, our team will deliver the product you ordered at your home address as soon as possible.";
txt_subject.Text = "";
txt_name.Text = "";
txt_surname.Text = "";
txt_phone.Text = "";
txt_address.Text = "";
txt_email.Text = "";
txt_subject.Text = "";
txt_product.Text = "";
dropdownlist.SelectedIndex = -1;
}
catch (Exception)
{
confirm.Text = "The order can't be proceed at the moment, please try again later.";
confirm.ForeColor = Color.Red;
}
干杯,感谢任何帮助。
解决方案
好吧,我会在网络表单 1 上根本不使用超链接,而是使用按钮。
当您单击该按钮时,您可以设置/获取/获取所需的值,将其保存在 session() 中,然后在 Web 表单 2 中,您可以获取该值。
这是网络表格 1:
说一个网格来选择一些东西:
<br />
<h2>Please select Hotel</h2>
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" DataKeyNames="ID">
<Columns>
<asp:BoundField DataField="HotelName" HeaderText="HotelName" SortExpression="HotelName" />
<asp:BoundField DataField="City" HeaderText="City" />
<asp:BoundField DataField="Province" HeaderText="Province" />
<asp:TemplateField HeaderText="Select Hotel">
<ItemTemplate>
<asp:Button ID="cmdSEL" runat="server" Text="Pick me"
RowID = '<%# Container.DataItemIndex %>'
onclick="cmdSEL_Click"
/>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
所以它看起来像这样:
代码不多,但我们通过了选择的行 - 这样代码更少,世界贫困更少,而且根本没有太多代码。
所以上面的代码是这样的:
protected void Page_Load(object sender, System.EventArgs e)
{
if (IsPostBack == false)
LoadGrid();
}
public void LoadGrid()
{
string strSQL
= "SELECT ID, HotelName, City, Province from tblHotels order by HotelName";
using (SqlCommand cmdSQL = new SqlCommand(strSQL, new SqlConnection(My.Settings.TEST3)))
{
cmdSQL.Connection.Open();
GridView1.DataSource = cmdSQL.ExecuteReader;
GridView1.DataBind();
}
}
protected void cmdSEL_Click(object sender, EventArgs e)
{
Button btn = sender;
int rowIX = btn.Attributes.Item["RowID"];
GridViewRow gRow = GridView1.Rows[rowIX];
Session("RowData") = gRow;
Response.Redirect("MyForm2.aspx");
}
现在,在网页 2 上,我们有这个:
<h2>Hotel information you picked</h2>
<br />
<asp:TextBox ID="txtHotel" runat="server" Height="26px" Width="299px" Font-Size="X-Large"></asp:TextBox>
<br />
<asp:TextBox ID="txtCity" runat="server" Height="26px" Width="299px" Font-Size="X-Large"></asp:TextBox>
<br />
结果如下所示:
代码是这样的:
protected void Page_Load(object sender, System.EventArgs e)
{
if (IsPostBack == false)
{
GridViewRow gRow = Session("RowData");
txtHotel.Text = gRow.Cells[0].Text;
txtCity.Text = gRow.Cells[1].Text;
}
}
事实上,在大多数情况下,我可能会传递 PKID,并让其他页面对数据库执行查询——因此,这将允许您让任何页面或任何代码跳转到第二页,而您不必通过说只是一个 gridview 行数据行,但只有一个 PK id,并且那个 2n 页面可以并且会从数据库中加载/拉取数据。
换句话说,虽然我确实传递了一整行数据?我会传递产品 id 表的 PK,然后在第二个网页中,我会根据 PK 提取该行数据。
这样,您只传递一个产品 ID。现在在上面,我通过了 RowID。但是,我认为在现实世界的实践中,我会传递产品 ID(如果暴露)。我还可以传递该数据库行的 PK ID(这是最好的选择)。但是,作为一般规则,我不会放置或允许 PK ID 出现在标记中。
但是,如果您传递某种 PK 或产品 ID?然后你可以拉数据库行,并以这种方式获取值。
例如:
public void GetData()
{
using (SqlCommand cmdSQL = new SqlCommand("SELECT * from tblHotels WHERE ID = @ID", new SqlConnection(My.Settings.TEST3)))
{
cmdSQL.Parameters.Add("@ID", SqlDbType.Int).Value = Session("PKID");
cmdSQL.Connection.Open();
DataTable rstData = new DataTable();
rstData.Load(cmdSQL.ExecuteReader);
DataRow MyRow = rstData.Rows(0);
txtHotel.Text = MyRow("HotelName");
txtCity.Text = MyRow("City");
etc. etc. etc. etc.
}
}
因此,传递 PK id,然后在登录页面上,您可以通过从数据库中再次拉取行来拉取/设置所需的所有数据。
我也非常,但是非常非常非常建议如果您使用 session() 来传递 PK 行值,那么您要做的第一件事就是将 session() 值传输到视图状态或隐藏字段 - 您想要保留该值,并且不要在页面加载之后再使用 session() 。原因很简单 - session() 对于登录用户(或用户)来说是全球性的。因此,如果他们启动两个页面(第二页),那么两者都可能最终在同一个 PK 行 ID 上运行 - 所以隐藏字段、隐藏文本框或更好的是,在第一页加载时将会话(PKID)值转换为视图状态. 这样,您可以打开一个以上的浏览器副本,并且您的应用程序不会像纸牌屋一样崩溃-因为启动多个页面将假定会话(PKID)值,但对于浏览器的多个副本打开。
如果你不这样做,那么如果用户打开一个页面买房子,而你打开另一个浏览器选项卡到另一个房子?好吧,当他们单击购买房屋时-如果您为此使用会话(PKID),他们将购买错误的房屋
所以会话非常好 - 没有暴露客户端值。没有参数,或者任何需要显示或显示或存储的客户端。但请记住,基于服务器的 session() - 它是每个用户而不是每个网页。这就是为什么我建议您尽快获取/获取“ID”,然后将其转移到视图状态或网页本地的内容。因此,获取/获取范围(或需要)到 ONE 页面的任何会话值。所以像登录ID这样的东西 - 没关系。但是 PK 值等 - 它们通常在一页的上下文中,并且 session() 对一个用户来说是全局的。
推荐阅读
- ruby - 如何在 Nokogiri 中使用条件
- python - Why isn't this function type-annotated correctly (error: Missing type parameters for generic type)?
- javascript - 基于变量分配数组的 Javascript document.getElementsByName()
- javascript - 默认导出后 React 组件为空
- selenium - 无法从下拉硒中选择项目而不选择
- groovy - Spock无法识别的块标签:给定
- html - 引导折叠不适用于嵌套无序列表
- c - 如何防止显示 MCI 窗口?
- javascript - 使用 Javascript 从控制器访问变量
- vim - Vim:如何在不使用箭头键的情况下从当前目录列表中打开文件