我有一个有很多路线的网站。
某些路线,例如/sector-overview
指向我希望用户查看的特定页面。
其他路线,例如/sectoroverview
是一个最终呈现主页上包含的部分的动作。
第二条路径仅仅是应用程序的内部路径,但如果用户在其地址栏中输入该路径(这是一个容易犯的错误),系统会将其视为有效请求并返回HTML部分。
我可以将第二条路线重命名为/internal-sectoroverview
,但这并不能解决问题,只是将其隐藏起来。
如果用户键入此请求,是否有任何方法可以阻止处理请求?我处理这个问题的最佳方式是什么?
答案 0 :(得分:8)
您可以使用route constraints来阻止路线。但是,在您的情况下,我会使用[ChildActionOnly]
来装饰您的内部操作:
[ChildActionOnly]
public ActionResult Overview()
{
return View();
}
通过执行此操作,仅在使用@Html.Action
或@Html.RenderAction
时才会呈现操作。如果您尝试通过浏览器访问它,则会收到错误。
<强>更新强>
要返回404而不是错误,您可以覆盖控制器上的OnException
方法并在那里处理它。像这样:
protected override void OnException(ExceptionContext filterContext)
{
filterContext.ExceptionHandled = true;
//check if filterContext.Exception was thrown by child action only (maybe by text)
filterContext.Result = new HttpStatusCodeResult(404);
}
答案 1 :(得分:1)
如果我理解正确,你应该使用属性ChildActionOnly来解决部分未被调用的问题。如果你不希望你的行动中的某个方法可以被调用,那么仅供参考{ {3}}
答案 2 :(得分:0)
我有类似的问题,人们发现这可能也需要 - 如果从返回PartialViewResult的函数满足某个条件,我想返回404。我的解决方案是
public PartialViewResult MyFunction()
{
if( criteria ) {
Response.StatusCode = 404;
return null;
}
}