3

[RegularExpression]コードをクライアントに書き込むときに、MVC のバリデーターから HTML エンコードされた値を取得しています。これはエラー メッセージの問題ではありませんが (後で表示するためにエンコードする必要があるため)、実際には正規表現を台無しにしています :) 文字列フィールドでは、私の正規表現は次のようになります。

[RegularExpression(@"^[^\<\>]*$", ErrorMessage = "May not contain <,>")]

これが mvc3 によって書き出されると、次のように表示されます。

<input ... data-val-regex-pattern="^[^\&amp;lt;\&amp;gt;]*$" 
           data-val-regex="May not contain &amp;lt;,&amp;gt;" .../>

編集:

  • エンコーディングのために、それもキャッチしていましたが、次の<>ような単語にもつまずきました:
  • tティムのように
  • gヤギのように
  • おそらく;、しかし私はそれをテストしませんでした

この正規表現の目的は、ページ上のすべての検証を無効にしてサーバー側で実行するのではなく、< と > を除外することです。このフィールドは複数の Unicode 言語を受け入れ、長さはわずか 12 文字です。

私の選択は次のようになります。

  1. 1 つのページで asp.net の入力サニティ チェックを無効にし、アクションでのみチェックします。
  2. 3 つ以上の Unicode 範囲 +/- ダッシュと数字 - .net + js compat に一致する複雑な正規表現を見つけます。
  3. クライアント側の検証を持たないカスタム正規表現バリデーターを作成する
  4. バリデーターを使用し[Remote]て、他のフィールドの場合と同様にサーバー側でそれを行います

私は今、#3 に傾いていますが、組み込み機能を維持する方法を見つけたいと思っています。この出力エスケープを無効にする方法はありますか?

4

2 に答える 2

4

しばらく時間がかかりましたが、実際の文字の代わりにUnicode リテラルを使用するという、今では明らかなことがわかりました<>

私の正規表現はこのようになり、.Net と JS の両方で動作します

// \u003c = <,  \u003e = >
[RegularExpression(@"^[^\u003C\u003E]*$", ErrorMessage = "...")]

最終的に、そのコードがどこにでもないようにするためのカスタム検証属性になりました。カスタムの「デフォルト」オブジェクト アダプタと、この正規表現のカスタム jquery 検証を使用すると、フォーマットの 2 つ目の正規表現を追加できるようになります。もう一日働く。カスタムクラスと検証は次のとおりです。

正規表現属性のカスタム サブクラス:

[AttributeUsage(AttributeTargets.Property, AllowMultiple = false)]
public class RegexUnsafeChars : RegularExpressionAttribute
{
    public RegexUnsafeChars() : base(@"^[^\u003C\u003E]*$")
    {
        base.ErrorMessage = "May not contain <,>";
    }
}

これはカスタム属性であり、プロバイダーは完全一致のみをチェックするため、アダプターを手動で宣言する必要があります。ありがたいことに、組み込みの正規表現を再利用できます。このコードApplication_Start()Global.asax.cs

DataAnnotationsModelValidatorProvider.RegisterAdapter(
            typeof(RegexUnsafeChars), 
            typeof(RegularExpressionAttributeAdapter));
于 2012-06-05T03:24:22.923 に答える
0

jQuery 検証は正常に動作するはずであり、テストしたところ実際に正常に動作しました。値は適切にエンコードされます。

モデル:

public class MyViewModel
{
    [DataType(DataType.MultilineText)]
    [RegularExpression(@"^[^\<\>]*$", ErrorMessage = "May not contain <,>")]
    public string Text { get; set; }
}

コントローラ:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        var model = new MyViewModel();
        model.Text = "<Hello";
        return View(model);
    }

    [HttpPost]
    public ActionResult Index(MyViewModel model)
    {
        return View(model);
    }
}

意見:

@model MyViewModel

<script src="@Url.Content("~/Scripts/jquery.validate.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.js")" type="text/javascript"></script>

@using (Html.BeginForm())
{
    @Html.EditorFor(x => x.Text)
    @Html.ValidationMessageFor(x => x.Text)
    <button type="submit">OK</button>
}

結果:

ここに画像の説明を入力

目立たないクライアント側の検証は正常に機能しています。

于 2012-05-25T07:17:48.060 に答える