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

本文关键字:浏览器 访问 操作 表单提交 重定向 MVC | 更新日期: 2023-09-27 18:22:10

我现在花了几个小时学习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风格"解决方案。

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

您需要在InquirySubmitted ActionResult中放入逻辑,以防止用户在不应该查看页面的情况下查看页面。

您已将InquirySubmitted方法传递给您的模型(ContactInfo)。您是否可以简单地检查传递给该方法的数据,如果没有,则将用户重定向到错误页面(或您选择的其他页面)?

另一种解决方案是在会话中设置一个布尔值,指示用户完成了"ContactUs"表单。然后您可以在InquirySubmitted中检查该会话对象。

首先,我不得不说。。谁在乎某人是否可以直接导航到查询提交页面?那里有什么机密信息或敏感信息吗?如果没有,那又怎样?它疼什么?

但是,如果你决心这样做。"如何使操作无法直接从浏览器访问"的问题的答案是,你可以简单地使用Html.Action()来渲染页面,然后用[ChildActionOnly]属性装饰操作方法。

然而,这实际上并不能解决问题,因为间接访问操作只能回答你的问题,而不能解决你的问题。最终,你需要将用户重定向到一个url来加载页面,所以你需要一些逻辑来确定他们是否可以查看页面。这是

不确定这是否仍然适用于MVC3,但在MVC2中有效。

您的global.asax文件中有您的url结构。您可以将您的InquirySubmitted添加到无法访问的url列表中。