Можем ли мы передать модель в качестве параметра в RedirectToAction?
Я хочу знать, существует какая-либо методика, поэтому мы можем передать Model
в качестве параметра в RedirectToAction
Пример:
public class Student{
public int Id{get;set;}
public string Name{get;set;}
}
контроллер
public class StudentController : Controller
{
public ActionResult FillStudent()
{
return View();
}
[HttpPost]
public ActionResult FillStudent(Student student1)
{
return RedirectToAction("GetStudent","Student",new{student=student1});
}
public ActionResult GetStudent(Student student)
{
return View();
}
}
Мой вопрос. Могу ли я передать студенческую модель в RedirectToAction?
Ответы
Ответ 1
Использование TempData
Представляет набор данных, которые сохраняются только с одного запроса на Следующий
[HttpPost]
public ActionResult FillStudent(Student student1)
{
TempData["student"]= new Student();
return RedirectToAction("GetStudent","Student");
}
[HttpGet]
public ActionResult GetStudent(Student passedStd)
{
Student std=(Student)TempData["student"];
return View();
}
Альтернативный способ
Передайте данные с помощью строки запроса
return RedirectToAction("GetStudent","Student", new {Name="John", Class="clsz"});
Это создаст запрос GET, например Student/GetStudent?Name=John & Class=clsz
Убедитесь, что метод, который вы хотите перенаправить, украшен [HttpGet]
как вышеуказанный RedirectToAction выдаст запрос GET с статусом http код 302 Найдено (общий способ выполнения перенаправления URL)
Ответ 2
Просто вызовите действие без необходимости для redirect to action
или ключевого слова new
для модели.
[HttpPost]
public ActionResult FillStudent(Student student1)
{
return GetStudent(student1); //this will also work
}
public ActionResult GetStudent(Student student)
{
return View(student);
}
Ответ 3
Да, вы можете передать модель, которую вы показали, используя
return RedirectToAction("GetStudent", "Student", student1 );
Предполагая, что student1
является экземпляром Student
который будет генерировать следующий URL-адрес (если вы используете маршруты по умолчанию, а значение student1
- ID=4
и Name="Amit"
)
.../Student/GetStudent/4?Name=Amit
Внутренне метод RedirectToAction()
создает RouteValueDictionary
с использованием значения .ToString()
каждого свойства в модели. Однако привязка будет работать только в том случае, если все свойства в модели являются простыми свойствами, и она терпит неудачу, если какие-либо свойства являются сложными объектами или наборами, потому что метод не использует рекурсию. Если, например, Student
содержит свойство List<string> Subjects
, тогда это свойство приведет к строковому значению запроса
....&Subjects=System.Collections.Generic.List'1[System.String]
и привязка завершится с ошибкой, и это свойство будет null
Ответ 4
[HttpPost]
public async Task<ActionResult> Capture(string imageData)
{
if (imageData.Length > 0)
{
var imageBytes = Convert.FromBase64String(imageData);
using (var stream = new MemoryStream(imageBytes))
{
var result = (JsonResult)await IdentifyFace(stream);
var serializer = new JavaScriptSerializer();
var faceRecon = serializer.Deserialize<FaceIdentity>(serializer.Serialize(result.Data));
if (faceRecon.Success) return RedirectToAction("Index", "Auth", new { param = serializer.Serialize(result.Data) });
}
}
return Json(new { success = false, responseText = "Der opstod en fejl - Intet billede, manglede data." }, JsonRequestBehavior.AllowGet);
}
// GET: Auth
[HttpGet]
public ActionResult Index(string param)
{
var serializer = new JavaScriptSerializer();
var faceRecon = serializer.Deserialize<FaceIdentity>(param);
return View(faceRecon);
}
Ответ 5
Я нашел что-то вроде этого, помогает избавиться от жестко закодированных тегов tempdatap >
public class AccountController : Controller
{
[HttpGet]
public ActionResult Index(IndexPresentationModel model)
{
return View(model);
}
[HttpPost]
public ActionResult Save(SaveUpdateModel model)
{
// save the information
var presentationModel = new IndexPresentationModel();
presentationModel.Message = model.Message;
return this.RedirectToAction(c => c.Index(presentationModel));
}
}