我正在学习MVC 3几小时后,现在和昨晚我遇到了一个问题,看起来像解决它会很简单,但我可以'似乎找到了一个解决方案。MVC表单提交 - 重定向到无法直接从浏览器访问的操作
我有一个简单的联系表单。最终用户填写表格并提交。当他们提交表单时,我将最终用户重定向到同一控制器中的其他操作,该操作呈现“查询已提交”页面/视图,该页面/视图基本上是“感谢页面”。
控制器是这样设置的。
public ActionResult ContactUs()
{
return View();
}
[HttpPost]
public ActionResult ContactUs(ContactInfo contactInfo)
{
if (!ModelState.IsValid)
{
return View();
}
//perform some business logic
return RedirectToAction("InquirySubmitted",contactInfo);
}
public ActionResult InquirySubmitted(ContactInfo contactInfo)
{
return View(contactInfo);
}
问题: 我不希望最终用户直接导航到通过浏览器的InquirySubmitted行动。
我只希望控制器中的ContactUs操作能够将用户发送到InquirySubmitted视图。
我试图使InquirySubmitted动作私人,只控制器可以调用它像这样:
private ActionResult InquirySubmitted(ContactInfo contactInfo)
但是,这会产生一个错误,我完全可以理解,因为我迫使浏览器来请求InquirySubmitted使用RedirectToAction()。
所以我的问题很简单:什么是最好的“MVC 3风格”解决这个问题。
@ Splash-X - 这是他可以做的一个选择,但如果用户由于某种原因刷新页面,它将重新提交联系请求。你通常会使用Post-Redirect-Get模式来解决这个问题。 – 2012-02-02 16:06:34
@ Splash-X是的解决方案在技术上的工作表示谢意。这是一个选项。但是Mystere Man声明按下F5会导致刷新,从而再次触发我所有的业务逻辑,并且他说这个解决方案打破了PRG模式,所以我希望有一个更理想的解决方案。截至目前,我看到的唯一解决方案是下面发布的一个答案,它使用会话来查看最终用户是否来自联系页面,如果他们尝试直接访问InquirySubmitted,是否不将它们发回给它。该解决方案将与Web表单解决方案相同。 – Matt 2012-02-02 16:27:04
@Matt我同意,但您的要求是,最终用户无法请求URL。通过创建一个动作,他们总是可以请求URL。 Ek0nomik是正确的,你可以使用会话变量来跟踪他们是否应该能够查看页面。您也可以查看引荐网址并查看它是否为表单页面,如果是,则显示该视图,否则返回重定向到表单。 – 2012-02-02 16:38:49