首页 > 解决方案 > 如何通过单击主 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;
        }

干杯,感谢任何帮助。

标签: javascriptc#asp.net

解决方案


好吧,我会在网络表单 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() 对一个用户来说是全局的。


推荐阅读