2

ビューモデル:

public class ViewModel
{
    [Display(Name = "Message")]
    [StringLength(500, ErrorMessage = "Your message must be {1} characters or fewer.")]
    public string Message { get; set; }
}

表示 (抜粋):

<div class="form-field-group">
    @Html.LabelFor(m => m.Message , "Your message:")
    @Html.TextAreaFor(m => m.Message )
    @Html.ValidationMessageFor(m => m.Message )
</div>

また、web.config で次のように目立たない検証を使用しています。

<appSettings>
    <add key="ClientValidationEnabled" value="true"/>
    <add key="UnobtrusiveJavaScriptEnabled" value="true"/>
</appSettings>

絶対に教科書的なもので、素晴らしく機能しているようです。

問題!

したがって、フォーム データの改行に関する HTML 仕様についての私の理解では、改行は CR LF としてエンコードされます。これは、このビューモデルの投稿を処理するコントローラー アクションをデバッグするときに確認できることです。

ただし、javascript を介して入力の値を読み取る場合、改行はブラウザーによって異なります (IE6-8 は CRLF を提供するようですが、Windows 上の Chrome および Firefox の最近のビルドは LF のみを提供します)。

つまり、改行を含むテキストを入力すると、jquery バリデーターは、たとえば 498 文字として表示されるものを通過させますが、モデル バインディングに到達するまでに 504 に変換され、ModelState.IsValid は (正しく)間違い。

これを修正するための最も優れた/最も簡単な方法について何かアイデアを持っている人はいますか?

4

1 に答える 1

2

MVC 控えめな検証 (jquery.validate.unobtrusive.js) は、jquery.validate.js を利用します。

したがって、この問題を修正する最も簡単な方法は、jquery.validate.js で maxlength が行う動作を変更することです (これは、jquery.validate.unobtrusive.js がアダプターを介して接続するものです)。

以下のコードは、maxlength を変更して問題を修正します。

(function ($) {

    if ($.validator && $.validator.methods && $.validator.methods.maxlength) {

        $.validator.methods.maxlength = function (value, element, param) {
            if (typeof value === 'string') {
                value = value.replace(/\r?\n/g, "\r\n");
            }

            var length = $.isArray(value) ? value.length : $.validator.prototype.getLength($.trim(value), element);
            return $.validator.prototype.optional(element) || length <= param;
        };
    }

})(jQuery);

これは Windows 以外のプラットフォームでは問題を引き起こさない (または別の問題を引き起こす) ことに注意してくださいhttp://en.wikipedia.org/wiki/Newline

独自の検証属性を作成し、IClientValidatable を実装して独自のクライアント側検証を追加することで、これを解決することもできますhttp://www.falconwebtech.com/post/2012/04/21/MVC3-Custom-Client-Side-Validation-with-目立たない-Ajax.aspx。これの欠点は、標準の StringLength 属性ではなく、属性を使用することを忘れないことです。自分の状況に最適なものを決定する必要があります。

于 2012-11-21T14:18:46.940 に答える