Я хотел задокументировать решение, которое преследовал, для всех, кто пришел.
Прежде всего, это хрупкая кладка; под этим я подразумеваю, что любые изменения в регистрации, сделанные через надлежащие каналы в 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 -->
Это вызывает следующий javascript, который я внедрил в другом месте в ascx:
<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>
Очевидно, что самой уродливой частью здесь является имя элемента управления электронной почтой, но каждое исследование, которое я смог найти по идентификатору элемента управления, указывает на то, что это детерминистическое, то есть оно будет таким же, если что-то не изменится на стороне ввода.
Итак, это решение, которое заставляет разработчика захотеть принять душ после написания (или купить Code Offsets ), но оно работает, и это быстро и легко.
Одно последнее предупреждение: этот код имеет странное поведение: если НИЧЕГО не будет заполнено в форме, будет подтверждено подтверждение, а не остальные. ValidationGroup не установлен правильно, верно? Насколько я могу сказать, неправильно. В конце концов, это не стоило отслеживать, так как остальная часть проверки запускалась после заполнения других полей, так что вот вам. Если кто-нибудь знает, что это за проблема, обновите этот вопрос.