1

ユーザーが名前を入力する剣道ウィンドウがあります。リモート検証を使用して、名前がデータベースに存在するかどうかを確認し、名前が存在しない場合にのみフォームを送信しています。

jQuery Validation Plugin v1.10.0 を使用しています。同じリモート検証アクションが通常のビューで問題なく使用されます。しかし、剣道ウィンドウ (部分ビュー) では、次の問題があります。

1) フォームの送信時にリモート検証が起動しません。キーアップ イベントとフォーカス アウトでのみ機能します。これは、IE (IE 8) と Chrome の両方で発生します。

2) IE (IE 8) では、検証はキーを押したときにのみ起動し、名前の後にスペースを押したときにのみ起動します。では、'John' という名前が無効であるとしましょう。「John」と入力しても検証メッセージは表示されませんが、「John」の後にスペースを押すと表示されます。また、バックスペースを使用すると、リモート検証が起動しません。

この問題の原因について何か考えはありますか?

ビューモデル:

public class MyViewModel
{
    public int ID { get; set; }
    [Required]
    [Remote("IsNameAvailable", "MyController", ErrorMessage = "The Name already exists.")]
    public string Name { get; set; }
}

コントローラ:

public ActionResult IsNameAvailable(Portfolio portfolio)
{
    var exists = // code to check if Name exists;

    return Json(!exists, JsonRequestBehavior.AllowGet);
}

public ActionResult ShowDialog(int id)
{
    var viewModel = new MyViewModel { ID = id };

    return PartialView("_Dialog", viewModel);                    
}

部分図 (剣道ウィンドウで表示):

@using (Html.BeginForm())
{
    @Html.AntiForgeryToken()

    @Html.HiddenFor(model => model.ID)

    <div class="editor-label">
        @Html.LabelFor(model => model.Name)
    </div>
    <div class="editor-field">
        @Html.TextBoxFor(model => model.Name)            
    </div>
    <div class="editor-field">
        @Html.ValidationMessageFor(model => model.Name)        
    </div>

    <p>
        <input type="submit" value="Save" />
    </p>
}

メイン ビュー:

@(Html.Kendo().Window().Name("dialog")
    .Title("Dialog")
    .Visible(false)
    .Modal(true)
    .Draggable(true)
    .Width(300)
    .Events(events => events.Refresh("onRefresh"))
)

<script type="text/javascript">
    function showDialog(id) {
        var wnd = $("#dialog").data("kendoWindow");
        var url = '@Url.Action("ShowDialog", "MyController")'; 

        wnd.refresh(
        {
            url: url,
            data: { id: id}
        });

        wnd.center().open();
    }

    function onRefresh(e) {
        $.validator.unobtrusive.parse($("#dialog"));
        $.validator.setDefaults({
            onkeyup: true,
            onfocusout: true,
            onsubmit: true
        });

        var form = $("#dialog").find('form');
        form.submit(function () {
            if (form.validate().valid()) {
                var wnd = $("#dialog").data("kendoWindow");
                wnd.close();
            }
        });
    }
</script>
4

1 に答える 1

1

あなたのコードはプラグインを壊しています...

$.validator.setDefaults({
    onkeyup: true,
    onfocusout: true,
    onsubmit: true
});

trueonkeyuponfocusout、およびonsubmitオプションの有効な値ではありません。falseこれらは、無効にするか、オーバーライドする機能にのみ設定できます。これらのオプションを有効にしたい場合は、それらを除外する必要があります...それらはすでにデフォルトになっています。

ドキュメントを参照してください...

onkeyup
タイプ: Boolean または Function()
キーアップ時に要素を検証します。フィールドが無効としてマークされていない限り、何も起こりません。それ以外の場合、各キーアップ イベントですべてのルールがチェックされます。false無効にするには、 に設定します。関数に設定して、検証を実行するタイミングを自分で決定します。 ブール値trueは有効な値ではありません。

onfocusout
タイプ: Boolean または Function()
ブラーの要素 (チェックボックス/ラジオ ボタンを除く) を検証します。何も入力されていない場合、フィールドがすでに無効としてマークされている場合を除き、すべてのルールがスキップされます。関数に設定して、検証を実行するタイミングを自分で決定します。ブール値trueは有効な値ではありません。

onsubmit (デフォルト: true)
タイプ: Boolean
送信時にフォームを検証します。false検証に他のイベントのみを使用するには、に設定します。関数に設定して、検証を実行するタイミングを自分で決定します。ブール値trueは有効な値ではありません。

于 2013-11-14T22:08:25.450 に答える