Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

  • Мы уже подразумеваем ^ и $, поэтому вам не нужно их добавлять. (Это не проблема, чтобы включить их, но они вам не нужны)
  • Это похоже на ошибку в 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

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

Ответ 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("&amp;","&");
tagBuilder.MergeAttributes(attrs);

Мы только заботились и усилители, почему эта буквальная замена

Ответ 6

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

^([a-zA-Z0-9 .\x26\x27-]+)$
  • \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; }