私が追求した解決策を他の誰かのために文書化したいと思いました。
何よりもまず、これはもろいクラッジです。つまり、DNN の適切なチャネルを通じて行われた登録への変更は、これを破る可能性が高いということです。スタイルを変更すると、それが壊れる可能性があります。それはもろいクラッジです...あなたは何をするつもりですか。一方で、それは非常に小さな労力であり、エンド ユーザーはそれが面倒だとは思いもしませんでした。
私が使用していたバージョンの DNN では、ユーザー登録は admin/users/user.ascx の下のユーザー コントロールに格納されていました。実際のコードは、ネストされたユーザー コントロールから出力されます。DNN のソースを掘り下げることなく、これに夢中になることはできませんでした (もちろん、これは別のオプションです)。一致しました。
それがまさに私がしたことです:
<dnn:propertyeditorcontrol id="UserEditor" runat="Server"
enableClientValidation = "true"
sortmode="SortOrderAttribute"
labelstyle-cssclass="SubHead"
helpstyle-cssclass="Help"
editcontrolstyle-cssclass="NormalTextBox"
labelwidth="200px"
editcontrolwidth="200px"
width="400px"
editmode="Edit"
errorstyle-cssclass="NormalRed"/>
<!-- new code starts here -->
<span id="spanEmailConfirm" style="display: inline-block; width: 400px;">
<table cellpadding="0" style="margin-left:3px" cellspacing="0" border="0">
<tr>
<td>
<div style="width: 400px;">
<div style="border:0px solid black; float: left; width: 200px;">
<img onclick="toggleDisplay('divHelpConfirmEmailAddress');" style="border-width: 0px;" alt="Enter a valid confirmation Email address" src="/images/help.gif" title="Enter a valid confirmation Email address" tabindex="-1" id="imgConfirmEmail"/>
<asp:Label runat="server" ID="lblConfirmEmail" class="SubHead">
Confirm Email Address:
</asp:Label>
</div>
<div style="float: right; width: 200px;">
<asp:TextBox class="NormalTextBox" onblur="validateEmail();" runat="server" id="txtConfirmEmail" /><img style="border-width: 0px;" alt="Email confirmation is required" src="/images/required.gif" title="Email confirmation is required"/>
</div>
</div>
</td>
</tr>
<tr>
<td>
<asp:RequiredFieldValidator runat="server" ID="reqEmailConfirm" CssClass="NormalRed" ControlToValidate="txtConfirmEmail" ErrorMessage="You must enter a valid confirmation email address." Display="Dynamic"></asp:RequiredFieldValidator>
<asp:CustomValidator runat="server" ID="reqEmailsMatch" CssClass="NormalRed" ControlToValidate="txtConfirmEmail" ValidateEmptyText="false" ClientValidationFunction="validateEmail" Display="Dynamic" ErrorMessage="Email confirmation value must match the email value."></asp:CustomValidator>
</td>
</tr>
<tr>
<td>
<div style="width:200px; display:none" class="Help" id="divHelpConfirmEmailAddress">
<span id="spanConfirmEmail">Confirm your email address.</span>
</div>
</td>
</tr>
</table>
</span>
<!-- new code ends here -->
これにより、ascx の別の場所に埋め込んだ次の JavaScript が呼び出されます。
<script type="text/javascript">
function validateEmail(sender, args) {
var emailControlName;
emailControlName = "dnn$ctr459$ManageUsers$User$UserEditor$ctl04$Email";
var emailControl = document.getElementsByName(emailControlName)[0];
args.IsValid = (emailControl.value == args.Value);
}
function toggleDisplay(controlId) {
var control = document.getElementById(controlId);
if (control.style["display"] == "block") {
control.style["display"] = "none";
} else {
control.style["display"] = "block";
}
}
</script>
明らかに、ここで最も醜い部分は電子メール コントロール名ですが、コントロール ID について私が見つけたすべての調査は、これが決定論的であることを示しています。つまり、入力側で何かが変更されない限り、同じになるということです。
したがって、これは、開発者が書いた後にシャワーを浴びたい (またはCode Offsetsを購入したい) ようなソリューションですが、機能し、迅速かつ簡単です。
最後の注意: このコードには、フォームに何も入力されていない場合、確認の検証が起動され、他の検証は起動されないという奇妙な動作があります。ValidationGroup が正しく設定されていませんよね?私が知る限り、間違っています。最終的に、他のフィールドが入力されると残りの検証が開始されるため、追跡する価値はありませんでした。この問題が何であるかを誰かが知っている場合は、この質問を更新してください。