繁体   English   中英

MVC表单提交-重定向到无法直接从浏览器访问的操作

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM