我有一个使用 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”的定义,并且找不到接受“AspDotNetStorefrontControls.Account”类型的第一个参数的扩展方法“txtPhone”
所以看起来编译器无法识别电话文本框。当我查看呈现的页面代码时(当然,当错误已被删除时)该框就在那里并且 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”的想法工作得很好,那么为什么这只会在电话框上失败?