Как использовать RedirectToAction при передаче модели представления в представление с другим маршрутом - PullRequest
1 голос
/ 21 марта 2012

У меня есть приложение ASP.NET MVC 3 с общим сценарием, в котором есть контроллер "About", использующий действия "Contact" и "ThankYou". Я хочу, чтобы пользователь зашел на /about/contact, заполнил форму, отправил ее и перешел на страницу /about/contact/thankyou *, где будет отображаться содержимое формы (также известное как модель представления).

** Обратите внимание, что нет контроллера «Контакт», и я не хочу создавать его для этой цели, если это возможно. *

Я использую RedirectToAction для предотвращения повторной отправки (шаблон Post / Redirect / Get ) и TempData для передачи модели представления на страницу благодарности. Я также могу использовать TempData, чтобы проверить, была ли достигнута страница благодарности напрямую, и перенаправить обратно на страницу формы контакта (чтобы она не регистрировалась как «цель» в веб-аналитике)

Но одну вещь, которую я не мог понять, это как использовать другой маршрут для страницы благодарности, чтобы она выглядела как /about/contact/thankyou

Я правильно делаю? Есть ли лучший способ?

Вот соответствующие действия в AboutController

<!-- language: c# -->
[RequireHttps]
public ActionResult Contact()
{
    var viewModel = new ContactViewModel();
    return View(viewModel);
}
[RequireHttps]
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Contact(ContactViewModel viewModel)
{
    if (!ModelState.IsValid)
    {
        return View(viewModel);
    }       
    // not sure if this is the best way or how to redirect to /contact/thankyou 
    TempData["viewModel"] = viewModel;
    return RedirectToAction("ThankYou");
}               

[RequireHttps]
public ActionResult ThankYou()
{
    var viewModel = TempData["viewModel"];
    // upon direct access, viewModel will be null and missing, so redirect to Contact form
    if (viewModel == null)
    {
        return RedirectToAction("Contact");
    }
    return View(viewModel);
}

1 Ответ

0 голосов
/ 22 марта 2012

Вы можете определить собственный маршрут до маршрута по умолчанию:

routes.MapRoute(
    "contact",
    "about/contact/thankyou",
    new { controller = "About", action = "ThankYou" }
);

Теперь, когда вы перейдете к /about/contact, будет выполнено действие Contact GET (вы должны переименовать его, как в вашем коде оно называется ContactUs). Затем пользователь заполняет форму и отправляет действие Contact POST. URL остается неизменным на данный момент: /about/contact. После перенаправления выполняется действие ThankYou, и URL-адрес изменяется на /about/contact/thankyou.

...