2012-03-21 1 views
1

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

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

Я использую 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); 
} 

ответ

0

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

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

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

+0

это приводит к тому, что все ссылки на сайте, указывающие на '/ about/contact', будут переписаны на' /about/contact/contact'...I сделало редактирование в примере кода, чтобы переименовать ContactUs в действие Contact ... – zam6ak

+0

Я изменил ваш подход и заставил его работать. Маршрут должен быть 'about/contact/thankyou', а в последней строке должно быть указано' new {controller = "About", action = "ThankYou"} 'Я думаю, вы заслуживаете кредита за то, что дали мне эту идею, но можете ли вы обновить ответ так что я могу отметить это? – zam6ak

+0

@ zam6ak, ответ обновлен. –