web-dev-qa-db-ja.com

asp.net mvc 4のDataAnnotations検証(正規表現)-レイザービュー

正規表現で特殊文字を使用すると、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の正規表現パターンは、モデルのRegularExpressionで指定されたとおりにレンダリングされないため、有効なデータ(Sam's)を入力してもエラーになります。

これをどのように処理できますか?

-UPDATE-

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

それでも私は同じ問題を抱えています。

44
Prasad

更新2012年7月9日-これは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

ダブルエンコードしているようです。

34
RickAndMSFT

これらの文字をエスケープしてみてください:

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

式の先頭で@記号を試してください。そのため、正規表現をコピーして「」に貼り付け、@記号を入れるだけで、エスケープ文字を入力する必要はありません。そのようです:

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

過去にも同様の問題がありました(TweeZzによると)。この場合、MvcHtmlStringを構築しているカスタムhtmlHelper拡張メソッドによってTextBoxForの出力を制御しています。1つのステップで、これらの控えめな検証属性を追加する必要があります。

var attrs = htmlHelper.GetUnobtrusiveValidationAttributes(name, metadata)

このメソッドを呼び出した後、属性はhtmlエンコードされるため、そこに正規表現バリデーターがあるかどうかを確認し、ある場合は、この属性をhtmlエンコード解除してからtagBuilderにマージします(「入力」タグを作成するため)

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

私たちは&ampだけを気にかけたので、この文字通りの置き換えは

1
petho

どのブラウザを使用していますか?あなたの例を入力し、IE8とChromeの両方で試してみました。値Sam'sを入力すると、正常に検証されました

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

IE DeveloperツールバーとChrome Developerモードを使用してDOMを検査すると、特殊文字は表示されません。

1
Dismissile

これらの値にASCIIコードを使用してみてください。

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

形式は\xnnです。ここでnnは2桁の16進文字コードです。 \unnnnを使用して、Unicode文字に4桁の16進文字コードを指定することもできます。

0
Ahmad Mageed

モデルクラスでこれを試してください

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

    public string FullName { get; set; }
0

問題は、正規表現パターンがHTMLエンコードされていることですtwice、正規表現の作成時とビューでのレンダリング時に1回です。

今のところ、TextBoxForを次のようにHtml.Rawでラップしてみてください。

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