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风格"解决方案。
您需要在InquirySubmitted ActionResult中放入逻辑,以防止用户在不应该查看页面的情况下查看页面。
您已将InquirySubmitted方法传递给您的模型(ContactInfo)。您是否可以简单地检查传递给该方法的数据,如果没有,则将用户重定向到错误页面(或您选择的其他页面)?
另一种解决方案是在会话中设置一个布尔值,指示用户完成了"ContactUs"表单。然后您可以在InquirySubmitted中检查该会话对象。
首先,我不得不说。。谁在乎某人是否可以直接导航到查询提交页面?那里有什么机密信息或敏感信息吗?如果没有,那又怎样?它疼什么?
但是,如果你决心这样做。"如何使操作无法直接从浏览器访问"的问题的答案是,你可以简单地使用Html.Action()
来渲染页面,然后用[ChildActionOnly]
属性装饰操作方法。
然而,这实际上并不能解决问题,因为间接访问操作只能回答你的问题,而不能解决你的问题。最终,你需要将用户重定向到一个url来加载页面,所以你需要一些逻辑来确定他们是否可以查看页面。这是
不确定这是否仍然适用于MVC3,但在MVC2中有效。
您的global.asax文件中有您的url结构。您可以将您的InquirySubmitted添加到无法访问的url列表中。