【问题标题】:Codebehind does not create button click event代码隐藏不创建按钮单击事件
【发布时间】:2017-09-08 18:49:57
【问题描述】:

我在新安装的 Visual Studio 2017 社区中创建了一个 ASP.NET 空网站。我正在尝试复制以下教程所示的步骤:https://youtu.be/5dCAXwhjIYU

我只是在表单上放置了三个文本框以及一个提交按钮。当我双击按钮时,IDE 只是在页面的源视图中突出显示按钮的 HTML。它不会在代码隐藏中创建事件处理程序,如视频所示和预期的那样。

我在后面的代码中为按钮单击手动创建了事件处理程序。当我尝试运行代码时,它告诉我我引用的字段不存在:

错误 CS0103 当前上下文中不存在名称“用户名”

这是我的 HTML 代码:

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Users.aspx.cs" Inherits="Users" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
        <div>
            UserName<br />
            <input id="UserName" type="text" /><br />
            UserEmail<br />
            <input id="UserEmail" type="text" /><br />
            UserCampus<br />
            <input id="UserCampus" type="text" /><br />
            <input id="SaveUser" type="submit" value="submit" /></div>
    </form>
</body>
</html>

C# 代码:

public partial class Users : System.Web.UI.Page
{
    protected void SaveUser_Click(object sender, EventArgs e)
    {
        SqlConnection BIGateConnection = new SqlConnection("Data Source=xxxxxxx;Initial Catalog=xxxxxxx;Integrated Security=True");
        {
            SqlCommand BIGateSQLCmd = new SqlCommand("Insert into [BIGateway].[dbo].[User] (UserName, userEmail, userCampus) VALUES (@userName, @userEmail, @userCampus)", BIGateConnection);
            BIGateSQLCmd.Parameters.AddWithValue("@", UserName.Text);
            BIGateSQLCmd.Parameters.AddWithValue("@", UserEmail.Text);
            BIGateSQLCmd.Parameters.AddWithValue("@", UserCampus.Text);
        }
    }
}

我到底做错了什么?

【问题讨论】:

  • 错误消息中引用了哪一行代码作为错误原因?
  • 以下每一行都出现错误:BIGateSQLCmd.Parameters.AddWithValue("@", UserName.Text); BIGateSQLCmd.Parameters.AddWithValue("@", UserEmail.Text); BIGateSQLCmd.Parameters.AddWithValue("@", UserCampus.Text);具体来说,它是在抱怨文本框项 UserName、UserEmail 和 UserCampus。

标签: c# asp.net visual-studio-2017


【解决方案1】:

如果你已经取了HTML文本框那么代码如下:

<input id="UserName" type="text" /><br />

在此您必须自己添加该行作为 runat="server"

如下所示:

<input id="UserName" type="text"  runat="server"/><br />

然后你可以将它用于服务器端。

希望对您有所帮助。

【讨论】:

  • 为什么input标签不继承form标签的runat设置?
  • runat="server" 属性表示表单应该在服务器上处理。它还表明服务器脚本可以访问封闭的控件:
  • 是的,我知道标签的作用。我在问为什么&lt;input id="UserName" type="text"&gt; 还不是runat="server",因为它包含在&lt;form id="form1" runat="server"&gt; 标记中。
  • @RobertHarvey 这就是 ASP 的工作原理。您将不得不问他们为什么以这种方式设计控件。但是请注意,对于几乎任何 ASP 应用程序,您的整个页面实际上总是处于服务器形式,因此您建议每个 HTML 元素(在实际意义上)都应该有runat=server,这或多或少是相同的就像完全省略它并假设所有元素都应该是服务器元素一样。
  • 我很高兴我不再做 ASP.NET(我很久以前切换到 ASP.NET MVC 并且从未回头)。
【解决方案2】:

视频不显示 ASPX 页面。我相信他使用了 TextBox 和 Button 服务器控件。

<form id="form1" runat="server">
    <div>
        UserName<br />
        <asp:TextBox runat="server" ID="UserName"/><br />
        UserEmail<br />
        <asp:TextBox runat="server" ID="UserEmail"/><br />
        UserCampus<br />
        <asp:TextBox runat="server" ID="UserCampus"/><br />
        <asp:Button runat="server" ID="SaveUser" OnClick="SaveUser_Click" Text="Submit"/>
    </div>
</form>

如果他使用常规 html input 和 runat="server",他将不得不在 Button1_Click 事件中访问 UserName.Value 的值,而他没有。

【讨论】:

    【解决方案3】:

    Afais 你没有找到按钮的点击事件。 添加

    SaveUser.OnClick += SaveUser_Click;
    

    到 page_load 事件。

    一般来说,我更喜欢 asp:Button 而不是输入。 实际上,它被呈现为输入控件。但有更多选择。但确实 runat="server" 缺少输入。

    【讨论】:

      猜你喜欢
      • 2015-02-16
      • 2012-03-19
      • 2012-05-01
      • 2023-03-15
      • 1970-01-01
      • 1970-01-01
      • 2016-03-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多