我现在正在学习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风格”解决方案是什么。
答案 0 :(得分:2)
您需要在InquirySubmitted ActionResult中放置逻辑,以防止用户查看该页面。
您已经将InquirySubmitted方法传递给您的模型(ContactInfo)。您是否只需检查传递给该方法的数据,如果没有,则将用户重定向到错误页面(或您选择的其他页面)?
另一种解决方案是在会话中设置一个布尔值,表示用户已完成“ContactUs”表单。然后,您可以在InquirySubmitted中检查该会话对象。
答案 1 :(得分:2)
首先,我不得不说..谁在乎是否有人可以直接浏览查询提交页面?是否有任何机密信息或敏感信息?如果没有,那又怎样?它伤害了什么?
但是,如果你决定这样做的话。您的“如何直接从浏览器访问操作”问题的答案是,您只需使用Html.Action()
呈现页面,然后使用[ChildActionOnly]
属性修饰操作方法。
这实际上并没有解决问题,因为间接访问操作只会回答您的问题,而不是解决您的问题。最终,您需要将用户重定向到URL以加载页面,因此您需要一些逻辑来确定他们是否可以查看页面。这是
答案 2 :(得分:0)
不确定这是否仍然适用于MVC3,但在MVC2中它起作用。
你的global.asax文件中包含你的url结构。您可以将您的InquirySubmitted添加到那里无法访问的网址列表中。