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" が問題なく機能するはずですが、電話ボックスだけで失敗するのはなぜでしょうか?