The DataAnnotations validator not working in asp.net mvc 4 razor view, when using the special characters in the regular expression.
Model:
[StringLength(100)]
[Display(Description = "First Name")]
[RegularExpression("^([a-zA-Z0-9 .&'-]+)$", ErrorMessage = "Invalid First Name")]
public string FirstName { get; set; }
Razor View:
@Html.TextBoxFor(model => Model.FirstName, new { })
@Html.ValidationMessageFor(model => Model.FirstName)
The unobtrusive validation is rendered in view as:
<input type="text" value="" tabindex="1" style="height:auto;" name="FirstName" maxlength="100" id="FirstName" data-val-regex-pattern="^([a-zA-Z0-9 .&amp;&#39;-]+)$" data-val-regex="Invalid First Name" data-val-length-max="100" data-val-length="The field FirstName must be a string with a maximum length of 100." data-val="true" class="textfield ui-input-text ui-body-d ui-corner-all ui-shadow-inset valid">
The regex pattern in the above html is not rendered as specified in the Model's RegularExpression, which results in error even when entering the valid data (Sam's
).
How can i handle this?
--UPDATE--
I have updated the code as per @Rick suggestion
[StringLength(100)]
[Display(Description = "First Name")]
[RegularExpression("([a-zA-Z0-9 .&'-]+)", ErrorMessage = "Enter only alphabets and numbers of First Name")]
public string FirstName { get; set; }
View Source shows the following:
<input data-val="true" data-val-length="The field FirstName must be a string with a maximum length of 100." data-val-length-max="100" data-val-regex="Enter only alphabets and numbers of First Name" data-val-regex-pattern="([a-zA-Z0-9 .&amp;&#39;-]+)" id="FirstName" maxlength="100" name="FirstName" type="text" value="" />
Still i have the same issue.
Try escaping those characters:
What browser are you using? I entered your example and tried in both IE8 and Chrome and it validated fine when I typed in the value
Sam's
When I inspect the DOM using IE Developer toolbar and Chrome Developer mode it does not show any special characters.
The problem is that the regex pattern is being HTML encoded twice, once when the regex is being built, and once when being rendered in your view.
For now, try wrapping your TextBoxFor in an
Html.Raw
, like so:UPDATE 9 July 2012 - Looks like this is fixed in RTM.
^
and$
so you don't need to add them. (It doesn't appear to be a problem to include them, but you don't need them)View source shows the following:
It looks like we're double encoding.
Try @ sign at start of expression. So you wont need to type escape characters just copy paste the regular expression in "" and put @ sign. Like so:
Try this one in model class