.NET Core MVC Может перенаправлять страницу Ajax с Моделью

#.net #ajax #model-view-controller #asp.net-core-mvc

#.net #аякс #model-view-controller #asp.net-core-mvc #ajax

Вопрос:

Я отправляю свои данные из интерфейса, используя ajax, на серверный контроллер, я ожидаю, что контроллер сгенерирует модель и перенаправит новое представление с моделью; но оно никогда не перенаправляется. Возможно ли перенаправление внутри контроллера? Не Ajax?

Я просмотрел несколько других потоков, в которых говорится, что код перенаправления должен быть написан в функции успеха Ajax, которая работает, но я не могу передать модель в новое представление. Есть ли какой-нибудь способ передать модель отдельно с перенаправлением ajax? (Я не могу передать свои данные через URL, потому что объем данных довольно огромен). Пожалуйста, посоветуйтесь, заранее благодарю вас.

Способ управления:

 public IActionResult Input([FromBody] IEnumerable<HistTable> Input)
{
    //Some Code
    return View("/views/test/test.cshtml", model);
}
  

Аякс:

 $.ajax({
                type: "POST",
                url: "/test/input",
                dataType: "json",
                data: JSON.stringify(data),
                contentType: "application/json; charset=utf-8",
                success: function (e) {
                    //How to pass the model?
                    //window.location.replace(link);
                }
            });
  

Комментарии:

1. Почему бы не использовать ваше представление, которое вы перенаправляете, чтобы снова получить данные?

2. Мой ответ помог вам решить вашу проблему? Если это решено, пожалуйста, примите это как ответ, в противном случае, пожалуйста, сообщите мне о ваших все еще существующих проблемах.

Ответ №1:

Возможно ли перенаправление внутри контроллера? Не Ajax?

Фактически, если ajax полностью отключен, реальная операция перенаправления не может быть реализована только внутри контроллера.

Вы должны добиться этого, объединив ajax и контроллер этими двумя способами: TempData или Session для достижения этой функции.

И обратите внимание, что, поскольку вы передаете несколько фрагментов данных, перед сохранением serialize переведите их в json и получите их через deserialization .

1. Сессия

Таким образом, передайте данные через сеанс в контроллере, а затем перенаправьте на тестовое представление в функции успеха в ajax.

Сначала включите Session в файле startup.cs основного проекта.

Затем используйте следующий код:

    public IActionResult Test(List<Employee> model)
        {
            if (HttpContext.Session.GetString("model") != null)
            {
                model = System.Text.Json.JsonSerializer.Deserialize<List<Employee>>(HttpContext.Session.GetString("model"));
            } 
            return View(model);
        }
        public IActionResult Input([FromBody] List<Employee> Input)
        { 

            //Some Code
            HttpContext.Session.SetString("model", System.Text.Json.JsonSerializer.Serialize(Input)); 
            return Content("/test/test");
        }
  

Ajax:

  $.ajax({
                type: "POST",
                url: "/Test/input",
                //dataType: "json",
                data: JSON.stringify(
                    [{ Id: 1, FirstName: 'a', LastName: 'v', Gender: 'male' },
                    { Id: 2, FirstName: 'b', LastName: 'v', Gender: 'female' },
                    { Id: 3, FirstName: 'c', LastName: 'v', Gender: 'male' }]),
                contentType: "application/json; charset=utf-8",
                success: function (e) {
                    window.location.replace(e);
                }
            });
  

2.Временные данные

Во-первых, вам нужно передать model by TempData["data"] из Input в Test action by RedirectToAction("test") , потому что вы передаете несколько данных.

 public IActionResult Test(List<Employee> model)
        {  
            if (TempData["data"] != null)
            {
                model = System.Text.Json.JsonSerializer.Deserialize<List<Employee>>(TempData["data"].ToString()); 
                TempData.Keep();
            }
            return View(model);
        }
        public IActionResult Input([FromBody] List<Employee> Input)
        {
            //Some Code 
            TempData["data"] = System.Text.Json.JsonSerializer.Serialize(Input); 
            return RedirectToAction("test"); 
        }
 
  

Ajax:

 $.ajax({
                type: "POST",
                url: "/Test/input",
                //dataType: "json",
                data: JSON.stringify(
                    [{ Id: 1, FirstName: 'a', LastName: 'v', Gender: 'male' },
                    { Id: 2, FirstName: 'b', LastName: 'v', Gender: 'female' },
                    { Id: 3, FirstName: 'c', LastName: 'v', Gender: 'male' }]),
                contentType: "application/json; charset=utf-8",
                success: function (e) {
                    window.location.replace("/test/test");
                }
            });
  

Вот результат теста:

введите описание изображения здесь

Ответ №2:

Обычно вы отправляете ее как сообщение через тело. Или другой вариант — отправить какой-то идентификатор в URL-адресе и использовать его для получения модели на другой стороне.