Проверка DataAnnotations (регулярное выражение) в asp.net mvc 4 - просмотр бритвы - PullRequest
44 голосов
/ 23 ноября 2011

Валидатор 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; }

Razor View:

@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;amp;&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 не отображается, как указано в регулярном выражении модели, что приводит к ошибке даже при вводе действительных данных (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;amp;&amp;#39;-]+)" id="FirstName" maxlength="100" name="FirstName" type="text" value="" />

Тем не менее у меня та же проблема.

Ответы [ 8 ]

34 голосов
/ 21 февраля 2012

ОБНОВЛЕНИЕ 9 июля 2012 г. - Похоже, это исправлено в RTM.

  1. Мы уже подразумеваем ^ и $, поэтому вам не нужно их добавлять.(Похоже, не проблема включить их, но они вам не нужны)
  2. Это ошибка в ASP.NET MVC 4 / Preview / Beta.Я открыл ошибку

Вид источника показывает следующее:

data-val-regex-pattern="([a-zA-Z0-9 .&amp;&#39;-]+)"                  <-- MVC 3
data-val-regex-pattern="([a-zA-Z0-9&#32;.&amp;amp;&amp;#39;-]+)"      <-- MVC 4/Beta

Похоже, мы двойное кодирование.

10 голосов
/ 23 ноября 2011

Попробуйте экранировать эти символы:

[RegularExpression(@"^([a-zA-Z0-9 \.\&\'\-]+)$", ErrorMessage = "Invalid First Name")]
5 голосов
/ 07 сентября 2012

Попробуйте знак @ в начале выражения. Поэтому вам не нужно вводить escape-символы, просто скопируйте, вставьте регулярное выражение в "" и поставьте знак @. Вот так:

[RegularExpression(@"([a-zA-Z\d]+[\w\d]*|)[a-zA-Z]+[\w\d.]*", ErrorMessage = "Invalid username")]
public string Username { get; set; }
1 голос
/ 05 января 2012

В прошлом у нас была похожая проблема (как упоминалось в TweeZz).В нашем случае мы контролируем вывод TextBoxFor с помощью нашего пользовательского метода расширения htmlHelper, который создает MvcHtmlString, и там за один шаг нам нужно добавить эти ненавязчивые атрибуты проверки, которые выполняются через

var attrs = htmlHelper.GetUnobtrusiveValidationAttributes(name, metadata)

после вызоваВ этом методе атрибуты кодируются в формате html, поэтому мы просто проверяем, был ли там валидатор регулярных выражений, и, если это так, мы html отменяем кодирование этого атрибута, а затем объединяем их в tagBuilder (для создания тега input)* Мы заботились только о усилителях, поэтому буквальная замена

1 голос
/ 23 ноября 2011

Какой браузер вы используете?Я ввел ваш пример и попробовал как в 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, он не отображаетсялюбые специальные символы.

0 голосов
/ 18 декабря 2017

Попробуйте это в модельном классе

    [Required(ErrorMessage = "Enter full name.")]
    [RegularExpression("([A-Za-z])+( [A-Za-z]+)", ErrorMessage = "Enter valid full name.")]

    public string FullName { get; set; }
0 голосов
/ 23 ноября 2011

Проблема в том, что шаблон регулярного выражения кодируется в HTML дважды , один раз при построении регулярного выражения и один раз при визуализации в вашем представлении.

А пока попробуйте обернуть ваш TextBoxFor в Html.Raw, например так:

@Html.Raw(Html.TextBoxFor(model => Model.FirstName, new { }))
0 голосов
/ 23 ноября 2011

Попробуйте использовать код ASCII для этих значений:

^([a-zA-Z0-9 .\x26\x27-]+)$
  • \x26 = &
  • \x27 = '

Формат \xnn, где nn - шестнадцатеричный код из двух цифр.Вы также можете использовать \unnnn, чтобы указать четырехзначный шестнадцатеричный код символа Unicode.

...