我有一个公开可用的控制器( <动作>隐藏在任何安全属性下)。控制器还有一个公开的动作。
以下是控制器的示例结构:
public SomeController : Controller {
[HttpGet]
public ActionResult show(int id){
}
}
该操作有一个id
字段,这是必需的。但是,如果有人在没有所需id
的情况下输入格式错误的网址(或者当搜索引擎机器人点击带有所需id
的网址时),则会抛出一个不必要添加到日志的错误。
应该是处理此解决方案的理想解决方案。
我想到的可能的解决方案是:
是否有使用Attributes的通用方法来执行此操作?
P.S :(具体而言)通过显式我的意思是写if else条件来处理每个控制器的这种情况。
我很感激任何正确方向的提示。
答案 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)
可以返回项列表。取决于您的业务场景。