Передавать сложный объект с перенаправлением в ASP.NET MVC?
Привет,
У меня есть действие, которое выглядит так:
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Register(AdRegister adRegister, IEnumerable<HttpPostedFileBase> files)
AdRegister - это сложный класс, и мне нужно передать это в метод переадресации далее в действии Register, например:
return this.RedirectToAction("Validate", adRegister);
Действие Validate выглядит следующим образом:
public ActionResult Validate(AdRegister adRegister)
Я знаю, что могу передавать простые параметры, но в этом случае это сложный объект. Этот пример не работает, свойства adRegister будут пустыми.
Возможно ли это, и если да, то как?
BestRegards
Дополнительная информация: При регистрации действие примет adRegister и сделает som magic на нем, затем оно будет отправлено в действие Validate. Действие Validate вернет пользователю страницу проверки. Когда пользователь нажмет кнопку гранта, adRgister будет заполнен из формы, а затем отправлен на пост vValidate, где он будет сохранен. Я просмотрел временное размещение adRegister в кеше или базе данных, но будет лучше, если я могу просто передать его следующему действию.
Ответы
Ответ 1
Одна из возможностей - передать простые свойства в строке запроса:
return RedirectToAction(
"Validate",
new {
foo = adRegister.Foo,
bar = adRegister.Bar,
... and so on for all the properties you want to send
}
);
Другая возможность - сохранить его в TempData (для времени перенаправления) или сеанса (для времени жизни сеанса ASP.NET):
TempData["adRegister"] = adRegister;
return RedirectToAction("Validate");
а затем извлеките его из TempData:
public ActionResult Validate()
{
adRegister = TempData["adRegister"] as AdRegister;
...
}
Еще одна возможность (и та, которую я бы рекомендовал вам) - это сохранить этот объект в методе POST в вашем хранилище данных:
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Register(AdRegister adRegister, IEnumerable<HttpPostedFileBase> files)
{
...
string id = Repository.Save(adRegister);
return RedirectToAction("Validate", new { id = adRegister.Id });
}
а затем извлеките его из хранилища данных после перенаправления:
public ActionResult Validate(string id)
{
AdRegister adRegister = Repository.Get(id);
...
}
Ответ 2
идея, вероятно, создала бы переменную сеанса и передала бы Ключ, который ссылается на эту переменную сеанса, если требуется, чтобы объект искал несколько просмотров?
Ответ 3
ASP.NET MVC tempdata должен быть идеальным для этого.
Тем не менее, TempData или Session - это один из вариантов, но есть некоторые недостатки, например, быть совершенно нарушенными и часто мутными или сложными для отладки. Что может быть предпочтительнее, так это "спрятать" временное значение в постоянном хранилище, например, профиль пользователя или собственную базу данных, а затем передать ключ через метод проверки, который затем может загрузить данные из указанного хранилища. Это также открывает возможность восстановления заброшенных тележек и т.д.