如何返回404状态,无效参数传递给我的ASP.NET MVC控制器?
|
如果无效参数传递给我的控制器,我想返回HTTP状态404.例如,如果我有一个控制器,看起来像: 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)
{
...
}
}
但这看起来不好运 我看到this post和this answer几乎解决了我的问题: 在这个答案中,创建一个抽象的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处理. 我可以安全地覆盖 protected override void OnException(ExceptionContext filterContext)
{
if(filterContext.Exception.GetType() == typeof(ArgumentException))
{
filterContext.ExceptionHandled = true;
this.InvokeHttp404(filterContext.HttpContext);
}
else
{
base.OnException(filterContext);
}
}
在表面看来,它似乎工作,但是我通过这样做来存储任何问题? 这个语义正确吗? 解决方法最好的办法?动作方法选择器属性!为了实际避免可空的方法参数,我建议你编写一个Action Method Selector属性,实际上只有当id被提供时才匹配你的动作方法.它不会说没有提供参数,但是它不能匹配给定请求的任何动作方法. 我会调用此操作选择器RequireRouteValuesAttribute并将这样工作: [RequireRouteValues("id")]
public ActionResult GetAccount(int id)
{
...
}
为什么这是您的问题的最佳解决方案? 如果您查看代码,您希望返回一个与名称匹配的操作404,但参数绑定失败(由于未提供或任何其他原因).你所说的动作需要特别的动作参数,否则返回404. 所以当添加动作选择器属性添加动作的需求,所以它必须匹配名称(这是由MVC给出),并且还需要特定的操作参数.每当没有提供id时,此操作不匹配.如果有另一个动作匹配不是这里的问题,因为该特定操作将被执行.主要的事情是完成的.操作与无效路由请求不匹配,而返回404. 有一个应用程序代码! 检查my blog post,实现这种属性,您可以开箱即用.它完全符合您的要求:如果提供的路径数据不包含所有必需的值,则它将与您的操作方法不匹配. (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net – 如何将最新的TFS变更集编号插入到aspx页面?
- ASP .NET C#从Web路径中的文件中获取所有文本
- asp.net-mvc – 在ASP.NET MVC中创建报表的最佳方式
- asp.net-mvc – 为什么ASP.NET MVC 4与IList for editor不能
- asp.net – 如何在一个web项目正在调试的同时运行一个测试?
- asp.net – Visual Studio 2010图表控件:使Y轴成为整数值,
- asp.net – 表单验证忽略默认文档
- ASP.NET成员:拒绝用户阻止CSS,页面无法正确呈现?
- asp.net-mvc – 如何在ASP.NET MVC Web API中将URL作为参数
- asp.net – 获取用户的IP地址
