当id为null时,ASP.NET MVC抛出错误

时间:2012-05-09 07:33:37

标签: asp.net-mvc asp.net-mvc-3

我有一个公开可用的控制器( <动作>隐藏在任何安全属性下)。控制器还有一个公开的动作。

以下是控制器的示例结构:

 public SomeController : Controller {


       [HttpGet] 
       public ActionResult show(int id){

       }

 }

该操作有一个id字段,这是必需的。但是,如果有人在没有所需id的情况下输入格式错误的网址(或者当搜索引擎机器人点击带有所需id的网址时),则会抛出一个不必要添加到日志的错误。

应该是处理此解决方案的理想解决方案。

我想到的可能的解决方案是:

  • 将id设置为Nullable(int?id)并通过将调用者重定向到显示适当错误的其他页面来显式处理没有值的情况
  • 明确发送404错误

是否有使用Attributes的通用方法来执行此操作?

P.S :(具体而言)通过显式我的意思是写if else条件来处理每个控制器的这种情况。

我很感激任何正确方向的提示。

2 个答案:

答案 0 :(得分:2)

您需要路线约束。这将有助于路由器更早地丢弃URL(导致404)而不是更晚(路由有效,转到操作,操作barf因为缺少参数)。

http://www.asp.net/mvc/tutorials/controllers-and-routing/creating-a-route-constraint-cs

示例默认路由(可能替换global.asax.cx中的现有路由):

// order is important; more specific routes to less specific routes is what you want
//
// default index action, with no ID
routes.MapRoute(
    "Default_Index",
    "{controller}/",
    new {controller="Home", action="Index"}
 );

// default create action, with no ID
routes.MapRoute(
    "Default_Create",
    "{controller}/Create",
    new {controller="Home", action="Create"}
 );

// default action requiring an ID (such as EDIT)
routes.MapRoute(
    "Default",
    "{controller}/{action}/{id}",
    new {controller="Home", action="Index"},
    new {id = @"\d+" }
 );

答案 1 :(得分:1)

我建议使用自定义错误页面返回404状态,因为有人正在请求不存在的资源。

如果它可以返回表示该请求的结果,则可以将其设置为Nullable类型,否则返回404状态。

例如如果id为null或返回该特定项,则action方法Index(int? id)可以返回项列表。取决于您的业务场景。