C# C编译器无法识别某些控件元素

C# C编译器无法识别某些控件元素,c#,javascript,asp.net,aspdotnetstorefront,C#,Javascript,Asp.net,Aspdotnetstorefront,我有一个站点正在使用aspdotnetstorefront平台,尽管这应该适用于任何C站点。在名为Account的dll中有一个自定义控件。它有几个元素,包括供客户输入姓名、电话号码等的文本框 我已经用DotPeek检查了源代码,并验证了我使用的命名约定是否正确 当选中与账单相同的复选框帐户信息时,我试图使用javascript onChange事件将名字、姓氏和电话号码复制到较低的框中。因此,如果客户选择信息相同,则当他们从一个框移动到下一个框时,信息将自动复制 奇怪的是,这适用于某些文本框,

我有一个站点正在使用aspdotnetstorefront平台,尽管这应该适用于任何C站点。在名为Account的dll中有一个自定义控件。它有几个元素,包括供客户输入姓名、电话号码等的文本框

我已经用DotPeek检查了源代码,并验证了我使用的命名约定是否正确

当选中与账单相同的复选框帐户信息时,我试图使用javascript onChange事件将名字、姓氏和电话号码复制到较低的框中。因此,如果客户选择信息相同,则当他们从一个框移动到下一个框时,信息将自动复制

奇怪的是,这适用于某些文本框,但不适用于其他文本框。为了简单起见,我删除了复制内容的JS,并将其替换为一个用于测试的弹出框

这样做有效,当我更改文本时,会出现一个Hello World弹出框:

ctrlAccount.txtFirstName.Attributes.Add("onchange", "alert('hello,world')");
但这并不是:

ctrlAccount.txtPhone.Attributes.Add("onchange", "alert('hello,world')");
我得到的错误是:

CS1061:“AspDotNetStorefrontControls.Account”不包含“txtPhone”的定义,也不包含扩展方法“txtPhone” 接受类型为的第一个参数 找不到“AspDotNetStorefrontControls.Account”

因此,编译器似乎无法识别电话文本框。当我查看呈现的页面代码时,当错误被删除时,当然框在那里,ID是正确的

使用DotPeek阅读源代码我看到:

public Account()
{

  this._txtFirstName = new TextBox();
  this._txtLastName = new TextBox();
  this._txtEmail = new TextBox();
  this._txtPassword = new TextBox();
  this._txtPasswordConfirm = new TextBox();
  this._txtPhone = new TextBox();

}

private void AssignClientReferenceID()
{
  this._txtFirstName.ID = "txtFirstName";
  this._txtLastName.ID = "txtLastName";
  this._txtEmail.ID = "txtEmail";
  this._txtPassword.ID = "txtPassword";
  this._txtPasswordConfirm.ID = "txtPasswordConfirm";
  this._txtPhone.ID = "txtPhone";      
}

为了可读性,我删除了一些其他字段。但在我看来,电话号码的文本框应该有txtPhone、txtFirstName和txtLastName的概念,它们工作得很好,那么为什么只在电话框上失败呢

这是VS bug,简单的重启应该会对您有所帮助。

您添加到问题中的代码只显示ID的分配,没有其他内容。我看不到帐户控制的全部源代码,但通常带有前导下划线的字段是受保护的或私有的,为了公开这些字段,使用了公共属性,因此请检查是否存在名为txtPhone的公共属性

编辑

尝试在上面的行上用插入符号按F12键(在txtFirstName或txtPhone上),查看这些属性的定义位置

附言:
不要混淆类的id和公共属性的名称

右键单击txtFirstName部分并选择“转到定义”。确保txtPhone属性在附近定义且可访问。

如果在visual studio上打开项目,可以右键单击txtPhone或txtFirstName,然后单击“转到定义”。它会把你带到定义它的地方。也许txtFirstName是从其他不存在TXTFONE的地方读取的


我得到了这样的警告——有时在编译器中,我的应用程序并没有出现错误,但在运行时,它可以识别定义,不会引起任何问题

我真的希望是这样,但是,不,我甚至没有使用VS,只是在文本编辑器中编辑代码。我尝试在IIS中重新启动该站点,但没有成功。@很好,您重新编译了代码吗?我的意思是,如果您更改了C代码并且没有用它构建新的.dll,即使重新启动IIS,您仍然会使用旧的.dll。您的字段有下划线。这不是问题吗?或者有属性?这应该是现成的。您的createaccount.aspx.cs文件中是否有这些行?ctrlAccount.Phone=Server.HtmlEncodeCommonLogic.IIFThisCustomer.Phone.Length!=0,此客户。电话,账单地址。电话;我们真的需要看看C代码才能知道出了什么问题。我昨天在一个答案上写了这个评论,但想让你看看@valis你重新编译代码了吗?我的意思是,如果您更改了C代码,并且没有用它构建新的.dll,即使重新启动IIS,您仍然会使用旧的.dll。-干杯这是一个代码隐藏页,它引用了.dll中的内容,但没有任何更改。代码显示了第二个块中分配的公共ID。例如,私有void AssignClientReferenceID{this.\u txtFirstName.ID=txtFirstName;事实上,寻址txtFirstName效果很好。xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
ctrlAccount.txtFirstName.Attributes.Add("onchange", "alert('hello,world')");
ctrlAccount.txtPhone.Attributes.Add("onchange", "alert('hello,world')");