First, take a look at the thing we can see
As you can see, at the From we have an invalid email address, while at the To we have no email address. Both fields have a RequiredFieldValidator
and another validator. In the case of the From, the other validator is a RegularExpressionValidator
. Since the To has an email address, its correct email address of Invalid is displayed and since it is not empty, Required is not displayed. My aim is to display the error at the rightmost corner, regardless of whether it is a RequiredFieldValidator
or a RegularExpressionValidator
and regardless of the relative structural position of the tag among its siblings. To keep things simple, I paste the structure I have for the From:
<div class="ui-field">
<label class="ui-label" for="<%= From.ClientID %>">From</label>
<span class="ui-field-req"> *</span>
<asp:RequiredFieldValidator ID="FromValidator" runat="server" ControlToValidate="From" CssClass="ui-field-error" ErrorMessage="Required" ForeColor="Red"></asp:RequiredFieldValidator>
<asp:RegularExpressionValidator ID="FromEmailValidator" runat="server" CssClass="ui-field-error" ValidationExpression="\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*" ControlToValidate="From" ErrorMessage="Invalid" ForeColor="Red"></asp:RegularExpressionValidator>
<asp:TextBox ID="From" runat="server" CssClass="ui-input"></asp:TextBox>
</div>
This is the relevant part of CSS I have written for the page:
.ui-form .ui-field-error {
float: right;
}
And this is what we have generated for the From as HTML:
<div class="ui-field">
<label class="ui-label" for="ctl00_PageBody_From">From</label>
<span class="ui-field-req"> *</span>
<span id="ctl00_PageBody_FromValidator" class="ui-field-error" style="color:Red;visibility:hidden;">Required</span>
<span id="ctl00_PageBody_FromEmailValidator" class="ui-field-error" style="color: red; visibility: visible;">Invalid</span>
<input name="ctl00$PageBody$From" type="text" value="[email protected]" id="ctl00_PageBody_From" class="ui-input">
</div>
Final detail: If I remove the inner text of Required of the RequiredFieldValidator
, then Invalid will jump to the right place. Is there a way either in plain CSS or some properties/attributes in ASP.NET to resolve this? If not, then the solution will involve Javascript DOM watchers which I would like to avoid.
This can be controlled by specifying Display
property of your validator. Since you do not want white space to occupy when there is no corresponding error message, you need to set your Display
property to Dynamic
.
<asp:RequiredFieldValidator ID="FromValidator" runat="server" ControlToValidate="From"
CssClass="ui-field-error" ErrorMessage="Required" ForeColor="Red" Display="Dynamic"/>
When you do not set this property, the default value of Static
is considered and space is occupied by the control equivalent to the length of the message you have on ErrorMessage
property of that control.
Dynamic
ensures that space for error message on the page is utilized only when validation fails for that control.
This MSDN article describes more about this property.