Передавать сложный объект с перенаправлением в 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 - это один из вариантов, но есть некоторые недостатки, например, быть совершенно нарушенными и часто мутными или сложными для отладки. Что может быть предпочтительнее, так это "спрятать" временное значение в постоянном хранилище, например, профиль пользователя или собственную базу данных, а затем передать ключ через метод проверки, который затем может загрузить данные из указанного хранилища. Это также открывает возможность восстановления заброшенных тележек и т.д.