【发布时间】:2012-02-03 00:43:30
【问题描述】:
我现在下班后正在学习 MVC 3,昨晚我遇到了一个看起来很容易解决的问题,但我似乎找不到解决方案。
我有一个简单的联系表格。最终用户填写表格并提交。当他们提交表单时,我将最终用户重定向到同一控制器中的不同操作,该操作呈现“查询提交”页面/视图,基本上是“感谢页面”。
控制器是这样设置的。
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)
但这会产生一个我完全理解的错误,因为我强制浏览器使用 RedirectToAction() 请求 InquirySubmitted。
所以我的问题很简单:这个问题的最佳“MVC 3 风格”解决方案是什么。
【问题讨论】:
-
@Splash-X - 这是他可以做的一种选择,但如果用户出于某种原因刷新页面,它将重新提交联系请求。您通常会使用 Post-Redirect-Get 模式来解决这个问题。
-
@Splash-X 是的,该解决方案在技术上确实有效,谢谢。这是一个选项。但是正如神秘人所说,按 F5 会导致刷新,这会再次触发我所有的业务逻辑,正如他所说,这个解决方案打破了 PRG 模式,所以我希望有一个更理想的解决方案。截至目前,我看到的唯一解决方案是下面发布的答案,该答案是使用会话来查看最终用户是否来自联系页面,如果他们尝试直接访问 InquirySubmitted,则如果没有将他们发送回该页面。此解决方案与 Web 表单解决方案相同。
-
@Matt 我同意,但您的要求是最终用户无法请求 URL。通过创建操作,他们始终可以请求 URL。 Ek0nomik 是对的,您可以使用会话变量来跟踪他们是否应该能够查看页面。您还可以查看引用 URL 并检查它是否是表单页面,如果是,则显示视图,否则返回重定向到表单。
标签: c# asp.net-mvc asp.net-mvc-3