#.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-адресе и использовать его для получения модели на другой стороне.