Как я могу сохранить посты MVC JQuery Ajax сухими? - PullRequest
5 голосов
/ 13 июня 2011

Я использую Ajax для POST-обновлений на сервере:

$("#my-check-box").change(function () {

         var value = $(this).attr("checked");
         var url = '<%: Url.Routes().MyAction() %>';
         $.ajaxSetup({ cache: false });
         $.post(url, { **myActionParameterName**: value }, function (data) {

             if (data.result != "success") {
                 alert(data.error);
             }

         });


     });

Я не хочу записывать имя параметра на стороне клиента (в случае его изменения), но есть ли способизбежать этого?

Ответы [ 3 ]

3 голосов
/ 13 июня 2011

Простой ответ: нет.В конце концов, вашему AJAX нужно знать, как вызывать параметр, так или иначе.

То, о чем вы говорите, это абстракция , а не "Не делайте"Стратегия «Повтори себя».DRY означает «Не повторяйте свою логику более одного раза», а не «Не ссылайтесь на переменные».Если бы это было так, вы бы не смогли сделать какую-либо ссылку на переменные или параметры, потому что вы технически повторяете имя переменной.

Вам придется ссылаться на что-то , и на что-то будет ссылаться более одного раза, один раз на стороне клиента и один раз на стороне сервера.Конечно, вы можете абстрагироваться во что-то другое, но, в конце концов, возможно, проще всего просто сослаться на ваш параметр действия и не беспокоиться об этом.

Рефакторинг в любом случае потребует простого поиска / замены., который не изменился бы ни под каким видом абстракции.

Теперь, если вы ссылаетесь на этот объект JSON более одного раза или создаете его странным образом несколько раз в вашем JavaScript, именно тогда в игру вступает DRY, и вам следуетсоздайте метод, в котором вы можете передать данные для его построения.

1 голос
/ 15 июня 2011

Я бы порекомендовал использовать функциональность jQuery.extend (), чтобы упростить ваши вызовы и создать API javascript.Check проверить это видео из MVC Conf

Я использую стандартный вызов ajax, как это

//A standard ajax api call that takes in a set of options
//This uses the jQuery extend method to merge the supplied options with a set of defaults
(function ($) {
    $.apiCall = function (options) {
        var config = $.extend({
            type: 'GET',
            data: {},
            contentType: 'application/x-www-form-urlencoded',
            success: function () { },
            error: function () { }
        }, options);

        $.ajax({
            type: config.type,
            url: config.url,
            contentType: config.contentType,
            data: config.data,
            success: function (result) {
                config.success(result);
            },
            error: function (result) {
                config.error(result);
                flashError('An error occured during the operation');
                //Okay, so this last bit is kindof a problem. Your nice, sharable api should not be referencing something
                //  on the master page. So you could pass it all the way down. But that means you have to have this defined
                //  lots of places. Or you could create another js object to wrap this. There are several ways to do this and
                //  how you do it is up to you.
            }
        });
    }
})(jQuery);

Затем я расширяю его с API для каждой сущности

//User api object
//Uses the prototype method to make sure all objects of this type have required functions
var patientsApi = function () { }

userApi.prototype.getUsers = function (options,Id) {
    var config = $.extend({
        success: function () { },
        error: function () { }
    }, options);

    $.apiCall({
        url: '/Users/GetUser',
        data:{ID:Id},
        success: function (result) { config.success(result); }
    });
}

Затем вы можете позвонить со страницы, как это

        var api = new userApi();
        var UserId= $("#UserId").val();

        api.getUsers({
            success: function (result) {          
            //Do some stuff
        }
     },userId);
0 голосов
/ 15 июня 2011

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

    var varType;
    var varUrl;
    var varData;
    var varContentType;
    var varDataType;
    var varProcessData;          
    //Generic function to call ASMX/WCF  Service        
    function CallService() 
    {
            $.ajax({
                type        : varType, //GET or POST or PUT or DELETE verb
                url         : varUrl, // Location of the service
                data        : varData, //Data sent to server
                contentType : varContentType, // content type sent to server
                dataType    : varDataType, //Expected data format from server
                processdata : varProcessData, //True or False
                success     : function(msg) {//On Successfull service call
                ServiceSucceeded(msg);                    
                },
                error: ServiceFailed// When Service call fails
            });
    }

Тогда есть функция для успеха

function ServiceSucceeded(result) {//When service call is successful
 ....
}

Тогда функция для сбоев

 function ServiceFailed(result) {
 ...
 }

Затем, наконец, пример вызова функции ajax:

 function GetWCFJSON() {
        varType = "POST";
        varUrl = "service/WCFService.svc/GetMyData";
        varData = '{"States": "' + $('#ddlStates').val() + '"}';
        varContentType = "application/json; charset=utf-8";
        varDataType = "json";
        varProcessData = true;
        CallService();
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...