JQuery пост на контроллер и перенаправить для просмотра MVC ASP.net - PullRequest
0 голосов
/ 22 января 2019

У меня есть несколько флажков и кнопка (не в форме)

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

Затем контроллер создает модели представления, и я хочу перенаправить пользователя в правильное представление, передав модель представления в представление.

JQuery:

 $.ajax({
      url: AppSettings.baseUrl + "BOM/getMultiBOM",
      type: 'POST',
       data: JSON.stringify(data)
 });
* 1009 Контроллер *
    [HttpPost]
    public ActionResult getMultiBOM(multiBOMPostModel multiBomsPostModel)
    {

       BOM bom = null;
       foreach (int value in multiBomsPostModel.bomsArray)
       {

          bom = db.BOMs.Find(value);
       }
       BOMViewModel viewModel = getViewModel(bom, null);

       return RedirectToAction("OpenMultiBOM", new { viewModel = viewModel, bom = bom });
   }
    public ActionResult OpenMultiBOM(BOMViewModel viewModel, BOM bom)
    {
        viewModel.projectModel = new ProjectViewModel
        {
            project = bom.Project

        };
        return View(viewModel);
    }

Это, вероятно, немного беспорядок.

Я думаю, что jQuery необходим для передачи значений флажков в контроллер.

Когда я использую RedirectToAction для метода, который затем возвращает представление, модель не передается, по-видимому, так как она отправляет модель в виде строки запроса.

Модель представления не проста и содержит списки, простые элементы и вложенные модели.

Может ли кто-нибудь помочь с наиболее эффективным способом перенаправления / возврата представления при передаче модели представления?

Ответ

Я сохранил ajax для отправки значений своих флажков на контроллер

 $.ajax({
     url: AppSettings.baseUrl + "BOM/getMultiBOM",
     type: 'POST',
     data: JSON.stringify(dataArr),
 }).done(function (result) {
       location.href = "/BOM/OpenMultiBOM";

 });

В моем контроллере я присвоил опубликованные значения postModel, а затем сохранил их в TempData. Ключевым моментом здесь было вернуть значение Json, которое затем позволило бы выполнить перенаправление на стороне клиента.

 public ActionResult getMultiBOM(multiBOMPostModel multiBOMPostModel)
    {  
        TempData["BOMs"] =  multiBOMPostModel;
        return Json("success");
    }

Затем у меня был другой метод HttpGet, который загружался бы после того, как страница перенаправлена ​​результатом Ajax, и приводил TempData к объекту.

[HttpGet]
    public ActionResult OpenMultiBOM(int? BomMarkupMessage = null)
    {
        var bomIds = TempData["BOMs"] as multiBOMPostModel;
}

Ответы [ 2 ]

0 голосов
/ 22 января 2019

Я бы сохранил серверную часть viewmodel, возможно, в переменной сеанса или, возможно, как TempData (TempData обычно доживает только до следующего запроса), и передал бы ключ для переменной сеанса второму контроллеру вслучай переменной сеанса, или используйте TempData непосредственно в вашем представлении в случае TempData.Это позволит избежать многократного прохождения всего объекта вперед и назад.

0 голосов
/ 22 января 2019

Таким образом, способ, которым я делал это раньше, это иметь пустой div в DOM.

<div id="partialViewContent">
<!-- Content will be loaded later. -->
</div>

Если у вас есть представление по умолчанию, вам нужно настроить его для загрузки из URI, используя приведенный ниже фрагмент.

$("#partialViewContent").load("Controller/Action",
        function (response, status) {
            if (status !== "success") {
                console.log("An error has occured when attempting to load partial view.");
            }
        });

Когда вы отправляете на свой контроллер действие через JQUERY, пусть действие возвращает частичное представление с моделью.(Предположим, модель относится к каждому частичному представлению.)

Затем, когда ваш ajax завершен, замените содержимое в componentViewContent ответом POST.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...