404
如果无效参数传递给我的控制器,我想返回一个HTTP状态。例如,如果我有一个看起来像这样的控制器:
public ActionResult GetAccount(int id)
{
...
}
然后,我想返回一个404
如果说这样的URL如遇到:
/ GetAccount
/ GetAccount / notanumber
即我想要捕捉ArgumentException
被抛出的东西。
我知道我可以使用可空类型:
public ActionResult GetAccount(int? id)
{
if(id == null) throw new HttpException(404, "Not found");
}
我希望可以在必要时将其添加到我的控制器中:
[HandleError(View="Error404", ExceptionType = typeof(ArgumentException))]
public class AccountsController : Controller
{
public ActionResult GetAccount(int id)
{
...
}
}
但这似乎并不奏效。
创建一个抽象的BaseController,可以从中派生所有其他控制器:
public abstract class MyController : Controller
{
#region Http404 handling
protected override void HandleUnknownAction(string actionName)
{
// If controller is ErrorController dont 'nest' exceptions
if (this.GetType() != typeof(ErrorController))
this.InvokeHttp404(HttpContext);
}
public ActionResult InvokeHttp404(HttpContextBase httpContext)
{
IController errorController = ObjectFactory.GetInstance<ErrorController>();
var errorRoute = new RouteData();
errorRoute.Values.Add("controller", "Error");
errorRoute.Values.Add("action", "Http404");
errorRoute.Values.Add("url", httpContext.Request.Url.OriginalString);
errorController.Execute(new RequestContext(
httpContext, errorRoute));
return new EmptyResult();
}
#endregion
}
这对处理未知动作很有效,404
但不允许我将无效数据作为一个处理404
。
我可以Controller.OnException(ExceptionContext filterContext)
像这样安全地重写:
protected override void OnException(ExceptionContext filterContext)
{
if(filterContext.Exception.GetType() == typeof(ArgumentException))
{
filterContext.ExceptionHandled = true;
this.InvokeHttp404(filterContext.HttpContext);
}
else
{
base.OnException(filterContext);
}
}
表面上它似乎工作,但我通过这样做存储任何问题?
这是在语义上正确的事情吗?
发布于 2018-03-22 10:43:53
免责声明:这并不包括所有的情况
对于示例中的网址,返回404可以在单行中完成。只需添加id
参数的路由约束。
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index" }, // Parameter defaults
new { id = @"\d+" } // restrict id to be required and numeric
);
就这样。现在任何没有id
或id
不是数字的匹配url,会自动触发未发现的错误(有很多方法可以处理,一个在你的例子中,另一个在使用自定义HandleErrorAttribute
等)。可以int
在操作中使用不可空的参数。
https://stackoverflow.com/questions/-100007719
复制相似问题