it-swarm.com.de

DataAnnotations-Validierung (regulärer Ausdruck) in asp.net mvc 4 - Rasiereransicht

Der DataAnnotations-Validierer funktioniert nicht in der asp.net mvc 4-Rasiereransicht, wenn die Sonderzeichen im regulären Ausdruck verwendet werden.

Modell:

[StringLength(100)]
[Display(Description = "First Name")]
[RegularExpression("^([a-zA-Z0-9 .&'-]+)$", ErrorMessage = "Invalid First Name")]
public string FirstName { get; set; }

Rasiermesser-Ansicht:

@Html.TextBoxFor(model => Model.FirstName, new { })
@Html.ValidationMessageFor(model => Model.FirstName)

Die unauffällige Validierung wird wie folgt dargestellt:

<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">

Das Regex-Muster in der obigen HTML-Datei wird nicht wie in der RegularExpression des Modells angegeben wiedergegeben, was zu Fehlern führt, selbst wenn die gültigen Daten (Sam's) eingegeben werden.

Wie kann ich damit umgehen?

--UPDATE--

Ich habe den Code gemäß @Rick-Vorschlag aktualisiert

[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; }

Quelltext anzeigen zeigt Folgendes:

<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="" />

Ich habe immer noch das gleiche Problem.

44
Prasad

UPDATE 9. Juli 2012 - Sieht aus, als wäre dies in RTM behoben. 

  1. Wir implizieren bereits ^ und $, so dass Sie sie nicht hinzufügen müssen. (Es scheint kein Problem zu sein, sie aufzunehmen, aber Sie brauchen sie nicht.)
  2. Dies scheint ein Fehler in ASP.NET MVC 4/Preview/Beta zu sein. Ich habe einen Fehler geöffnet

Quelltext anzeigen zeigt Folgendes:

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

Es sieht so aus, als würden wir doppelt kodieren.

34
RickAndMSFT

Versuchen Sie, diese Zeichen zu umgehen:

[RegularExpression(@"^([a-zA-Z0-9 \.\&\'\-]+)$", ErrorMessage = "Invalid First Name")]
10
Darin Dimitrov

Versuchen Sie es mit @ am Anfang des Ausdrucks. Sie müssen also keine Escape-Zeichen eingeben. Kopieren Sie einfach den regulären Ausdruck in "" und setzen Sie das @ -Zeichen. So wie:

[RegularExpression(@"([a-zA-Z\d]+[\w\d]*|)[a-zA-Z]+[\w\d.]*", ErrorMessage = "Invalid username")]
public string Username { get; set; }
5

In der Vergangenheit hatten wir ein ähnliches Problem (wie von TweeZz erwähnt). In unserem Fall steuern wir die Ausgabe von TextBoxFor durch unsere benutzerdefinierte htmlHelper-Erweiterungsmethode, die MvcHtmlString erstellt. Dort müssen wir diese unauffällig hinzufügen Validierungsattribute, die über

var attrs = htmlHelper.GetUnobtrusiveValidationAttributes(name, metadata)

nach dem Aufruf dieser Methode werden die Attribute mit HTML-Code codiert. Daher wird einfach überprüft, ob ein Validator für reguläre Ausdrücke vorhanden ist. Wenn dies der Fall ist, hacken Sie das Attribut aus und fügen es in tagBuilder ein (zum Erstellen des "input" -Tags).

if(attrs.ContainsKey("data-val-regex"))
    attrs["data-val-regex"] = ((string)attrs["data-val-regex"]).Replace("&amp;","&");
tagBuilder.MergeAttributes(attrs);

Wir haben uns nur um & Verstärker gekümmert

1
petho

Welchen Browser benutzen Sie? Ich habe Ihr Beispiel eingegeben und sowohl in IE8 als auch in Chrome versucht, und es wurde überprüft, wenn der Wert Sam's eingegeben wurde.

 public class IndexViewModel
 {
    [Required(ErrorMessage="Required")]
    [RegularExpression("^([a-zA-Z0-9 .&'-]+)$", ErrorMessage = "Invalid First Name")]
    public string Name { get; set; }
 }

Wenn ich das DOM mit der IE Developer Toolbar und dem Chrome Developer-Modus inspiziere, werden keine Sonderzeichen angezeigt.

1
Dismissile

Verwenden Sie für diese Werte den Code ASCII:

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

Das Format ist \xnn, wobei nn der zweistellige Hexadezimalzeichencode ist. Sie können auch \unnnn verwenden, um einen vierstelligen Hex-Code für das Unicode-Zeichen anzugeben.

0
Ahmad Mageed

Versuchen Sie es in der Modellklasse

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

    public string FullName { get; set; }
0

Das Problem ist, dass das Regex-Muster zweimal einmal in HTML codiert wird, einmal beim Erstellen des Regex und einmal beim Rendern in Ihrer Ansicht.

Versuchen Sie zunächst, Ihre TextBoxFor in einen Html.Raw einzuhüllen, wie folgt:

@Html.Raw(Html.TextBoxFor(model => Model.FirstName, new { }))
0
counsellorben