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

时间:2012-02-02 15:57:44

标签: c# asp.net-mvc asp.net-mvc-3

我现在正在学习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 View。

我试图将InquirySubmitted操作设为私有,这样只有控制器可以这样调用它:

private ActionResult InquirySubmitted(ContactInfo contactInfo)

但这会产生一个我完全理解的错误,因为我强迫浏览器使用RedirectToAction()请求InquirySubmitted。

所以我的问题很简单:这个问题的最佳“MVC 3风格”解决方案是什么。

3 个答案:

答案 0 :(得分:2)

您需要在InquirySubmitted ActionResult中放置逻辑,以防止用户查看该页面。

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

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

答案 1 :(得分:2)

首先,我不得不说..谁在乎是否有人可以直接浏览查询提交页面?是否有任何机密信息或敏感信息?如果没有,那又怎样?它伤害了什么?

但是,如果你决定这样做的话。您的“如何直接从浏览器访问操作”问题的答案是,您只需使用Html.Action()呈现页面,然后使用[ChildActionOnly]属性修饰操作方法。

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

答案 2 :(得分:0)

不确定这是否仍然适用于MVC3,但在MVC2中它起作用。

你的global.asax文件中包含你的url结构。您可以将您的InquirySubmitted添加到那里无法访问的网址列表中。