【问题标题】:Some elements of control not recognized by C# compilerC# 编译器无法识别某些控制元素
【发布时间】:2014-07-07 14:10:01
【问题描述】:

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

我已使用 DotPeek 检查了源代码,并确认我使用了正确的命名约定。

我试图使用javascript ondchange事件将第一个名称,姓氏和电话号码复制到较低框中的复选框(检查与计费相同)时。因此,如果客户选择相同的信息,当他们从一个盒子移动到另一个盒子时,它会被自动复制。

奇怪的是,这适用于某些文本框,但不适用于其他文本框。为了简单起见,我删除了复制内容的 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”的想法工作得很好,那么为什么这只会在电话框上失败?

【问题讨论】:

  • 您的字段有下划线。这不是问题吗?还是有属性?
  • 这应该可以开箱即用。您的 createaccount.aspx.cs 文件中有这些行吗? ctrlAccount.Phone = Server.HtmlEncode(CommonLogic.IIF(ThisCustomer.Phone.Length != 0, ThisCustomer.Phone, BillingAddress.Phone));
  • 我们确实需要查看 C# 代码才能知道问题所在。
  • 我昨天在一个答案上写了这个评论,但想让你看到它。 """@valis 好吧,您是否重新编译了代码?我的意思是,如果您更改了 C# 代码并且没有从中构建新的 .dll,即使您重新启动 IIS,您仍将使用旧的 .dll。"" “ - 干杯!
  • 这是在页面后面的代码中,它引用了 .dll 中的内容,但都没有改变。

标签: c# javascript asp.net aspdotnetstorefront


【解决方案1】:

您添加到问题中的代码仅显示 ID 的分配,没有其他内容。我看不到Account 控件的完整源代码,但通常 带有前导下划线的字段是受保护的或私有的,为了公开这些字段,使用了公共属性,所以请检查它是否存在 公共财产名为txtPhone

编辑

ctrlAccount.txtFirstName.Attributes.Add("onchange", "alert('hello,world')");
ctrlAccount.txtPhone.Attributes.Add("onchange", "alert('hello,world')");

尝试按F12 并在上面的行中将插入符号放在txtFirstNametxtPhone 上,以查看这些属性的定义位置。

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

【讨论】:

  • 该代码显示了在第二个块中分配的公共 ID。例如 private void AssignClientReferenceID() { this._txtFirstName.ID = "txtFirstName";事实上,解决 txtFirstName 工作得很好。
  • xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
【解决方案2】:

这是VS的错误,简单的重启应该可以帮助你。

【讨论】:

  • 我真的希望就是这样,但是,不。我什至没有使用 VS,只是在文本编辑器中编辑代码。我尝试在 IIS 中重新启动站点,但没有成功。
  • @valis 好吧,你重新编译代码了吗?我的意思是,如果您更改了 C# 代码并且没有从中构建新的 .dll,即使您重新启动 IIS,您仍将使用旧的 .dll。
【解决方案3】:

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

【讨论】:

    【解决方案4】:

    如果您在 Visual Studio 上打开您的项目,您可以右键单击 txtPhonetxtFirstName 并单击“转到定义”。它将带您到定义它的地方。也许txtFirstName 正在从不存在txtPhone 的其他地方读取。

    有时在编译器中我的应用程序会收到此类警告(不是错误),但在运行时,它会识别定义并且不会导致任何问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-11-20
      • 1970-01-01
      • 2020-01-12
      • 1970-01-01
      • 2019-05-30
      • 2014-08-17
      • 1970-01-01
      相关资源
      最近更新 更多