3

我有一个公开可用的控制器(该操作不能隐藏在任何安全属性下)。控制器也有一个公开可用的操作。

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

 public SomeController : Controller {


       [HttpGet] 
       public ActionResult show(int id){

       }

 }

该操作有一个id必填字段。id但是,当有人在没有 required 的情况下输入格式错误的 URL 时(或者当搜索引擎机器人点击带有 required 的 URL 时) ,会引发一个不必要的错误,该错误会添加到日志中id

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

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

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

有没有使用属性的通用方法来做到这一点?

PS:(具体来说)我的意思是写 if else 条件来处理每个控制器的这种情况。

我将不胜感激任何正确方向的提示。

4

2 回答 2

3

你需要一个路由约束。这将有助于路由器更早地抛出 URL(导致 404)而不是更晚(路由有效,执行操作,因为缺少参数而导致操作 barfs)。

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+" }
 );
于 2012-05-09T07:37:35.893 回答
1

I would suggest to return 404 status with a custom error page because some one is requesting a resource that doesn't exists.

You can make it as a Nullable type, if it can return a result which represents that request otherwise return 404 status.

For e.g. action method Index(int? id) could return list of items, if id is null or return that specific item. Depending on your business scenario.

于 2012-05-09T11:56:02.110 回答