[英]MVC Form Submit - Redirecting to an action that is not accessible from the browser directly
我现在下班后要学习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样式”解决方案?
您将需要在InquirySubmitted ActionResult中放入逻辑,以防止用户在不应有的情况下查看页面。
您已经在模型中传递了InquirySubmitted方法(ContactInfo)。 您能否简单地检查传递给该方法的数据,如果不存在则将用户重定向到错误页面(或您选择的其他页面)?
一种替代解决方案是在会话中设置一个布尔值,以指示用户已填写“ ContactUs”表单。 然后,您可以在InquirySubmitted中检查该会话对象。
首先,我不得不说。谁在乎有人可以直接导航到“查询”提交页面? 是否有任何机密信息或敏感信息? 如果没有,那又如何? 疼什么
但是,如果您确定要这样做。 关于“如何使操作不能直接从浏览器访问”的问题的答案是,您可以简单地使用Html.Action()
呈现页面,然后使用[ChildActionOnly]
属性装饰action方法。
但是,这实际上并不能解决问题,因为使动作可以间接访问只能回答您的问题,而不能解决您的问题。 最终,您需要将用户重定向到一个URL来加载页面,因此您将需要一些逻辑来确定他们是否可以查看页面。 这是
不知道这是否仍然适用于MVC3,但在MVC2中它可以工作。
您的global.asax文件中包含您的网址结构。 您可以将InquirySubmitted添加到在那里无法访问的网址列表中。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.