Проверка правильности данных (регулярное выражение) в asp.net mvc 4 - вид бритвы
Валидатор DataAnnotations не работает в режиме просмотра asp.net mvc 4 при использовании специальных символов в регулярном выражении.
Модель:
[StringLength(100)]
[Display(Description = "First Name")]
[RegularExpression("^([a-zA-Z0-9 .&'-]+)$", ErrorMessage = "Invalid First Name")]
public string FirstName { get; set; }
Вид бритвы:
@Html.TextBoxFor(model => Model.FirstName, new { })
@Html.ValidationMessageFor(model => Model.FirstName)
Ненавязчивая проверка представляется в виде как:
<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">
Шаблон регулярного выражения в приведенном выше html не отображается, как указано в Model RegularExpression, что приводит к ошибке даже при вводе действительных данных (Sam's
).
Как я могу справиться с этим?
- ОБНОВЛЕНИЕ -
Я обновил код в соответствии с предложением @Rick
[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; }
Источник просмотра показывает следующее:
<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="" />
Тем не менее у меня такая же проблема.
Ответы
Ответ 1
ОБНОВЛЕНИЕ 9 июля 2012 г. - Похоже, это исправлено в RTM.
- Мы уже подразумеваем
^
и $
, поэтому вам не нужно их добавлять. (Это не проблема, чтобы включить их, но они вам не нужны)
- Это похоже на ошибку в ASP.NET MVC 4/Preview/Beta. Я открыл ошибку.
Источник просмотра показывает следующее:
data-val-regex-pattern="([a-zA-Z0-9 .&'-]+)" <-- MVC 3
data-val-regex-pattern="([a-zA-Z0-9 .&amp;&#39;-]+)" <-- MVC 4/Beta
Похоже, мы двойные кодировки.
Ответ 2
Попробуйте выполнить эти символы:
[RegularExpression(@"^([a-zA-Z0-9 \.\&\'\-]+)$", ErrorMessage = "Invalid First Name")]
Ответ 3
Попробуйте знак @в начале выражения. Поэтому вам не нужно вводить escape-символы, просто скопируйте в него регулярное выражение в "" и поместите знак @. Например:
[RegularExpression(@"([a-zA-Z\d]+[\w\d]*|)[a-zA-Z]+[\w\d.]*", ErrorMessage = "Invalid username")]
public string Username { get; set; }
Ответ 4
Какой браузер вы используете? Я ввел ваш пример и попробовал как в IE8, так и в Chrome, и он был проверен отлично, когда я ввел значение Sam's
public class IndexViewModel
{
[Required(ErrorMessage="Required")]
[RegularExpression("^([a-zA-Z0-9 .&'-]+)$", ErrorMessage = "Invalid First Name")]
public string Name { get; set; }
}
Когда я проверяю DOM с помощью панели инструментов IE Developer и режима Chrome Developer, он не показывает никаких специальных символов.
Ответ 5
У нас была аналогичная проблема в прошлом (как упоминалось TweeZz).
В нашем случае мы контролируем вывод TextBoxFor с помощью нашего собственного метода расширения htmlHelper, который создает MvcHtmlString, поэтому в один шаг нам нужно добавить эти ненавязчивые атрибуты проверки, которые выполняются с помощью
var attrs = htmlHelper.GetUnobtrusiveValidationAttributes(name, metadata)
после вызова этого метода атрибуты кодируются html, поэтому мы просто проверяем наличие там регулярного выражения, и если да, то html unencode этот атрибут, а затем объединить их в tagBuilder (для создания тега ввода)
if(attrs.ContainsKey("data-val-regex"))
attrs["data-val-regex"] = ((string)attrs["data-val-regex"]).Replace("&","&");
tagBuilder.MergeAttributes(attrs);
Мы только заботились и усилители, почему эта буквальная замена
Ответ 6
Попробуйте использовать код ASCII для этих значений:
^([a-zA-Z0-9 .\x26\x27-]+)$
Формат \xnn
, где nn - двухзначный шестнадцатеричный код символа. Вы также можете использовать \unnnn
для указания четырехзначного шестнадцатеричного символьного кода для символа Unicode.
Ответ 7
Проблема заключается в том, что шаблон регулярного выражения кодируется HTML дважды, один раз при создании регулярного выражения и один раз при визуализации в вашем представлении.
Теперь попробуйте обернуть TextBoxFor в Html.Raw
, например:
@Html.Raw(Html.TextBoxFor(model => Model.FirstName, new { }))
Ответ 8
Попробуйте это в классе модели
[Required(ErrorMessage = "Enter full name.")]
[RegularExpression("([A-Za-z])+( [A-Za-z]+)", ErrorMessage = "Enter valid full name.")]
public string FullName { get; set; }