Передача сложного объекта с перенаправлением в ASP.NET MVC? - PullRequest
10 голосов
/ 23 марта 2011

Привет,

У меня есть действие, которое выглядит следующим образом:

[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 и сотворит магию, после чего оно будет отправлено в действие «Подтвердить».Действие Validate вернет страницу проверки пользователю.Когда пользователь нажмет кнопку «Предоставить», adRgister будет заполнен из формы и затем отправлен на пост vValidate, где он будет сохранен.Я пытался временно разместить adRegister в кеше или базе данных, но было бы лучше, если бы я мог просто передать его следующему действию.

Ответы [ 3 ]

17 голосов
/ 23 марта 2011

Одной из возможностей может быть передача простых свойств в строке запроса:

return RedirectToAction(
    "Validate", 
    new { 
        foo = adRegister.Foo, 
        bar = adRegister.Bar, 
        ... and so on for all the properties you want to send
    }
);

Другая возможность - сохранить их в TempData (для времени жизни перенаправления) или в Session (для времени жизниСеанс 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);
    ...
}
1 голос
/ 23 марта 2011

Темпдаты ASP.NET MVC должны идеально подходить для этого.

Тем не менее, TempData или Session - это один из вариантов, но имеет некоторые недостатки, такие как довольно грубые и часто мутные или трудно отлаживаемые.Что может быть предпочтительнее, так это «спрятать» временное значение в постоянном хранилище, таком как профиль пользователя или ваша собственная база данных, а затем передать ключ через метод validate, который затем может загрузить данные из указанного хранилища.Это также открывает возможность восстановления заброшенных тележек и тому подобного.

1 голос
/ 23 марта 2011

идея, вероятно, создаст переменную сеанса и передаст ключ, который ссылается на эту переменную сеанса, если объект требуется по нескольким представлениям?

...