【问题标题】:Automatically throw 404 errors when missing parameters for asp.net mvc缺少 asp.net mvc 的参数时自动抛出 404 错误
【发布时间】:2010-11-03 21:06:42
【问题描述】:

当 Google 机器人出现时,我经常收到以下错误:

参数字典包含“someclass”中方法“System.Web.Mvc.ActionResult Show(Int32)”的不可为空类型“System.Int32”的参数“id”的空条目。可选参数必须是引用类型、可空类型或声明为可选参数。
参数名称:参数

我想知道在这种情况下是否可以让应用程序抛出 404 而不是缺少参数异常。

谢谢!

更新以澄清我想要的是,此特定错误的所有情况都会引发 404 错误而不是 500。最好通过编写某种仅捕获此错误的包装器。

【问题讨论】:

    标签: c# asp.net-mvc


    【解决方案1】:
    public ActionResult Index(int? id)
    {
       if(!id.HasValue())
       {
         throw new HttpException(404, "Are you sure you're in the right place?");
       }
    }
    

    【讨论】:

    • 这行得通,但是您必须将此代码放入 every 操作方法中。难道没有更好的方式集中执行此操作吗?
    • @DrewNoakes 是的,我也是这么想的。另一种选择是执行 int id = 0 并默认为 0 如果没有传入任何内容,但您仍然需要检查每个适用的操作。
    【解决方案2】:

    你要找的是route constraints

    【讨论】:

    • 这意味着我将为我的应用程序中的大量操作编写自定义路由,因为我不能只更改通用路由,难道没有更好的方法吗?
    【解决方案3】:

    这不是一篇新文章,我不能保证在最近的 MVC 构建中没有更好的方法来做到这一点,但我认为这是一个很好的可能性:)

    我相信您应该能够编写一个自定义模型绑定器,它将检查 ID 属性是否存在并且是必需的,如果不存在则抛出 404 错误/拒绝绑定.. 我知道这并不多,但它可能会以正确的方式引导您:)

    附:可以在此处找到示例模型绑定器及其工作原理:
    http://weblogs.asp.net/melvynharbour/archive/2008/11/21/mvc-modelbinder-and-localization.aspx

    【讨论】:

      猜你喜欢
      • 2011-01-23
      • 2017-07-13
      • 2019-12-21
      • 1970-01-01
      • 2015-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多