Какой из них лучше? Сообщение Ajax или сообщение на странице [httppost контроллера], когда на странице есть только одна форма?

У меня есть страница под названием Bookprogram, которая содержит 6 элементов управления вводом, а именно txtName, txtEmail, txtPhone, selectcat [раскрывающийся список для категорий], txtDate, txtMessage. Теперь, когда я закончил со всеми проверками для вышеуказанного элемента управления, я хочу сохранить данные в db. Я знаю, как выполнять как в ajax, так и полностью размещать страницы.

Если он находится в ajax, после проверки я бы просто позвонил $.ajax и отправил данные в виде строки и загрузил их в контроллер, как показано ниже:

[HttpPost]
public JsonResult BookProgram(string name, string email, string phone, string category, string date, string message)
{
       //code to save into db
       return Json(result);
}

Если мне нужно опубликовать целую страницу, после проверки я просто сделаю $(form).submit(); и напишу в контроллере, как показано ниже:

[HttpPost] 
public ActionResult Bookprogram(Mymodel model)
{
     //Code to save the data 
     return View();
}

Я просто хочу знать, что лучше, безопаснее и удобнее использовать, так как после успешной отправки мне нужно отображать сообщение. Я знаю, что могу использовать любой из способов отображения сообщения, но действительно ли обратная передача [обновление страницы] необходима в этом сценарии, и если да, то каковы ее преимущества перед публикацией ajax?

РЕДАКТИРОВАТЬ:

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

$(form).on("submit", function (e) {
        e.preventDefault();
        ValidateForm(form);
        var selectedVal = $(form).find('select').children(":selected").val();
        if(selectedVal=="")
        {
            $(form).find('div.bootstrap-select').children(":first").addClass('alert-danger');
            $(form).find('div.bootstrap-select').next('.text-danger').html('Please select a category!');
        }
        var formContainer = $(form + ' .text-danger');
        if ($(formContainer).text().length == 0) {
            $.ajax({
                url: '/Home/BookProgram/',
                type: "POST",
                dataType: 'json',
                contentType: "application/json; charset=utf-8",
                data: $('#fbookprogram').serializeArray(),
                success: function (data) {
                    if (data.result == "Success") {
                          alert('success');
                    }
                    else {
                         alert('fail');
                        return false;
                    }
                    return true;
                }
            });
        }
        $(form).unbind('submit');
        return false;
    });

Контроллер:

public ActionResult BookProgram(MyModel model)
{
    if(ModelState.IsValid)
    {
        //code to save data
    }
    return Json(new { success = false });
}

Что мне здесь не хватает.


person Guruprasad J Rao    schedule 09.02.2015    source источник
comment
Вы все еще можете использовать public ActionResult Bookprogram(Mymodel model) для сообщения ajax (и вам следует это сделать, потому что вы можете воспользоваться привязкой модели и проверкой ModelState.IsValid)   -  person    schedule 09.02.2015
comment
@StephenMuecke Хорошо, это круто. Есть ли разница в безопасности и затратах времени на публикацию данных?   -  person Guruprasad J Rao    schedule 09.02.2015
comment
То, как вы это сделаете, действительно зависит от того, что вы делаете после сохранения данных. Если все, что вы делаете, это отображение сообщения, я бы просто отправил обычную отправку. Если в модели есть ошибки, вы можете вернуть представление (используя ModelState ошибки и ValidationMessageFor() для их отображения). Если данные сохранены в порядке, выполните перенаправление в другое представление (например, представление индекса или подробностей, где вы можете отобразить сообщение об успешном выполнении (с помощью TempData). Однако если вы хотите вернуться в представление для выполнения других действий на странице, тогда ajax может быть лучше.   -  person    schedule 09.02.2015
comment
Основываясь на вашем первом фрагменте кода, я подозреваю, что вы должны вручную создавать значения для обратной передачи - вы можете просто использовать $.post(url, $('form').serialize(), function(data) { // do something ...   -  person    schedule 09.02.2015
comment
это хорошее объяснение @StephenMuecke .. Спасибо за это ..   -  person Guruprasad J Rao    schedule 09.02.2015


Ответы (2)


Ответить

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

AJAX

  1. Асинхронный - с помощью AJAX вы получаете асинхронные вызовы, поэтому поток браузеров не блокируется. Это позволяет пользователю по-прежнему взаимодействовать с пользовательским интерфейсом, ожидая ответа на ваш запрос.

  2. Лучшая производительность - вам обычно не нужно перезагружать всю страницу, что приводит к меньшим накладным расходам и выполнению HTTP-запросов.

К вашему сведению - вы все еще можете привязать модель с помощью JsonResult

public JsonResult BookProgram(Mymodel model)
{
       //code to save into db
       return Json(result);
}
person heymega    schedule 09.02.2015
comment
Ну, теперь немного прояснилось !! есть что сказать относительно безопасности данных в обоих сценариях !! - person Guruprasad J Rao; 09.02.2015
comment
И AJAX, и Post Back в конечном итоге создают HTTP-запросы, поэтому нельзя считать один метод менее безопасным, чем другой. - person heymega; 09.02.2015
comment
@heymaga ... Подскажите, пожалуйста, как привязать модель к JsonResult ?? - person Guruprasad J Rao; 09.02.2015
comment
Данные запроса привязываются к модели точно так же, как и ActionResult. Помните, что JsonResult и ActionResult - это просто возвращаемые типы вашего метода. Тот факт, что вы используете контроллер, позволяет (по умолчанию) использовать привязку модели по умолчанию. Таким образом, вы можете привязать любой общедоступный метод в контроллере. - person heymega; 09.02.2015
comment
@heymaga .. То, что я только что попробовал, - это после проверки, я только что вызвал свой метод Jsonresult контроллера через ajax и попытался получить модель как параметр в этом методе, как вы указали в своем ответе. Но модель только что сходила на нет. Не могли бы вы подробнее рассказать об этом, если возможно, на примере. - person Guruprasad J Rao; 09.02.2015
comment
@Kaushik Добавьте код Ajax в свой исходный пост, и я его проверю :) - person heymega; 09.02.2015
comment
@heymaga .. Я отредактировал свой вопрос. Пожалуйста, проверьте это... :) - person Guruprasad J Rao; 09.02.2015
comment
@heymaga .. Я нашел решение. Спасибо за предложение .. :) - person Guruprasad J Rao; 09.02.2015

Ответить - это классический рабочий процесс. Делегируйте большую часть внутренней работы своему веб-браузеру. Вся ваша логика ответа рассчитывается на стороне сервера.

AJAX - это современный способ создания динамических веб-приложений. Базовый подход для одностраничных приложений. Большая часть работы в этом случае должна выполняться на стороне клиента.

person aleha    schedule 09.02.2015