正規表現で特殊文字を使用すると、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の正規表現パターンは、モデルの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;&#39;-]+)" id="FirstName" maxlength="100" name="FirstName" type="text" value="" />
それでも私は同じ問題を抱えています。
更新2012年7月9日-これはRTMで修正されたようです。
^
と$
を暗示しているので、それらを追加する必要はありません。 (それらを含めることは問題ではないようですが、必要ありません)ソースを表示すると、次のことがわかります。
data-val-regex-pattern="([a-zA-Z0-9 .&'-]+)" <-- MVC 3
data-val-regex-pattern="([a-zA-Z0-9 .&amp;&#39;-]+)" <-- MVC 4/Beta
ダブルエンコードしているようです。
これらの文字をエスケープしてみてください:
[RegularExpression(@"^([a-zA-Z0-9 \.\&\'\-]+)$", ErrorMessage = "Invalid First Name")]
式の先頭で@記号を試してください。そのため、正規表現をコピーして「」に貼り付け、@記号を入れるだけで、エスケープ文字を入力する必要はありません。そのようです:
[RegularExpression(@"([a-zA-Z\d]+[\w\d]*|)[a-zA-Z]+[\w\d.]*", ErrorMessage = "Invalid username")]
public string Username { get; set; }
過去にも同様の問題がありました(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("&","&");
tagBuilder.MergeAttributes(attrs);
私たちは&ampだけを気にかけたので、この文字通りの置き換えは
どのブラウザを使用していますか?あなたの例を入力し、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を検査すると、特殊文字は表示されません。
これらの値にASCIIコードを使用してみてください。
^([a-zA-Z0-9 .\x26\x27-]+)$
\x26
= &
\x27
= '
形式は\xnn
です。ここでnnは2桁の16進文字コードです。 \unnnn
を使用して、Unicode文字に4桁の16進文字コードを指定することもできます。
モデルクラスでこれを試してください
[Required(ErrorMessage = "Enter full name.")]
[RegularExpression("([A-Za-z])+( [A-Za-z]+)", ErrorMessage = "Enter valid full name.")]
public string FullName { get; set; }
問題は、正規表現パターンがHTMLエンコードされていることですtwice、正規表現の作成時とビューでのレンダリング時に1回です。
今のところ、TextBoxForを次のようにHtml.Raw
でラップしてみてください。
@Html.Raw(Html.TextBoxFor(model => Model.FirstName, new { }))