ASP.Net MVC: Можете ли вы использовать аннотации / проверку данных с вызовом AJAX / jQuery? - PullRequest
4 голосов
/ 29 апреля 2011

Можно ли использовать аннотации / проверку данных с вызовом AJAX / jQuery? Если да, приведите пример или сообщение, в котором приведен пример.

По сути, я видел пример использования аннотаций данных, однако это был полный пост обратно. Есть ли способ сделать с вызовом AJAX / jQuery? Не уверен, как вы это сделаете, так как я не уверен, как вы построите объект Model на стороне клиента. (Я полагаю, это то, что вам нужно сделать.)

Кто-то сказал мне, что это можно сделать, но я просто не понимаю, как это может быть.

Спасибо за вашу помощь.

Ответы [ 2 ]

7 голосов
/ 29 апреля 2011

Да - 100% я делаю это все время.Используйте Ajax.BeginForm и используйте ненавязчивую валидацию http://completedevelopment.blogspot.com/2011/02/unobstrusive-javascript-in-mvc-3-helps.html

, это будет испускать все, что вам нужно на стороне клиента ... хотя вам нужно снова подключить валидаторы, чтобы сообщить jQuery, что мы загрузили некоторый контент, который ему потребуетсяпроверить

Я думаю, что я получил эту идею / код от: http://xhalent.wordpress.com/2011/01/24/applying-unobtrusive-validation-to-dynamic-content/

, так или иначе, то, что у меня есть ниже, работает, и я в настоящее время использую его, хотя я добавил к нему небольшую отладку.

(function ($) {
    $.validator.unobtrusive.parseDynamicContent = function (selector) {

        var len = $(selector).length;

        //alert('got length');
        if ($(selector).length == 0) {
            alert('The selector (usually a div) passed in as the root level to start validation parsing at (rather than parsing the whole document again) could not be found in the DOM. Validation on this form will not likely continue. The selector parameter is:' + selector);
            return;
        }
        //use the normal unobstrusive.parse method
        $.validator.unobtrusive.parse(selector);

        //get the relevant form
        var form = $(selector).first().closest('form');
        if (form.length == 0) {
            alert('Could not find a form that was a parent of selector:' + selector + '\nValidation may not work properly');
            return;
        }


        //get the collections of unobstrusive validators, and jquery validators
        //and compare the two
        var unobtrusiveValidation = form.data('unobtrusiveValidation');
        //alert(unobtrusiveValidation.length);
        var validator = form.validate();

        $.each(unobtrusiveValidation.options.rules, function (elname, elrules) {
            if (validator.settings.rules[elname] == undefined) {
                var args = {};
                $.extend(args, elrules);
                args.messages = unobtrusiveValidation.options.messages[elname];
                //$('[name=' + elname + ']').rules("add", args);
                $('[name="' + elname + '"]').rules("add", args);
            } else {
                $.each(elrules, function (rulename, data) {
                    if (validator.settings.rules[elname][rulename] == undefined) {
                        var args = {};
                        args[rulename] = data;
                        args.messages = unobtrusiveValidation.options.messages[elname][rulename];

                        $('[name="' + elname + '"]').rules("add", args);
                    }
                });
            }
        });

    }
})($);

затем в каждом частичном представлении (или странице), которое вы используете для загрузки с помощью ajax, получите следующее: (обратите внимание, editCustomerAddress - это имя div, которое содержит мое новое содержимое, поэтому jQuery не должен повторно обрабатывать все на моей странице, но только из динамического содержимого вниз)

  <script type="text/javascript">
        try {
            //Since this may have been loaded as dynamic content ensure jQuery client validation knows we should be validating the content in this view.
            //jQuery validation runs when the original page loads - on the original content and not on dynamic (in this case ajax) content.
            //We don&#39;t need to validate the whole form again, only from this div down.

            //if I have a problem in jQuery 5, then try: $.validator.unobtrusive.parse("#editZone > div > form"); 
            $.validator.unobtrusive.parseDynamicContent(&#39;#editCustomerAddress&#39;);
        }
        catch (err) {
            alert(&#39;An error occured trying to tell jQuery to validate our new content. Ensure the code for parseDynamicContent has been included and you are referencing a valid element. Also, ensure the form has a context if it is a partial view by calling if (ViewContext.FormContext == null){ViewContext.FormContext = new FormContext();}  If that code is not present, data-val-* attributes will not be rendered.\n&#39; + err);
        }

    </script>

Также - вы хотите убедиться, что ваши частичные представления, которые не имеют собственных форм ajax или html, должны иметь формуконтекст через

@ {if (ViewContext.FormContext == null) {ViewContext.FormContext = new FormContext ();}

в противном случае ваши атрибуты data-val- * не будут передаваться вспомогательными методами.Это необходимо, если в ваших представлениях нет Ajax.BeginForm или Html.BeginForm для создания собственного контекста формы.

1 голос
/ 29 апреля 2011

Если вы используете Html.AjaxForm (вместо Html.BeginForm), он будет проверяться с использованием Ajax.

Однако я не думаю, что вы можете проверить с помощью jQuery.У Microsoft есть собственные библиотеки Ajax, и они сами ее вызывают / поддерживают.Я не думаю, что вы можете перехватить свой собственный код между ними.

...