我在ASP.NET MVC2项目中设置了默认路由,并希望为其他一些控制器添加/修改它。假设我有一个Customer控制器,其中包含期望的详细信息操作和“id”参数(int)。例如:
//
// GET: /Customer/Details/5
public ActionResult Details(int id)
{
//...
}
如果用户输入“非号码”,如何添加将返回404的路线? 我尝试添加以下“之前”的默认路由,但它不起作用......
routes.MapRoute(
"DefaultDigitsId", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index" },
new { id = @"\d+" }
);
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
);
注意,如果可能的话,我想保留默认路线...... 我的所有控制器都使用“详细信息”和“编辑”,其中需要“id”(int)参数。 我想知道是否有办法实现这一点,而无需指定多个路由(即通用的东西)......当然,目标是,如果用户输入类似“/ Customer / Details / apple”的东西,它不会抛出错误但将它们带到错误页面...
还有this post提示设置默认值,但我不知道该怎么做...
答案 0 :(得分:3)
我没试过,但你可能想尝试一下:
routes.MapRoute(
"DefaultDetails",
"{controller}/Details/{id}",
new { controller = "Home", action = "Details" },
new { id = @"\d+" }
);
routes.MapRoute(
"DefaultEdit",
"{controller}/Edit/{id}",
new { controller = "Home", action = "Edit" },
new { id = @"\d+" }
);
routes.MapRoute(
"Default",
"{controller}/{action}/{id}",
new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
我希望“Customer / Details / 1”使用第一条路线(将id验证为数字,对“Customer / Edit / 1”的调用使用第二条路线,同样地,并且调用“客户/购买/橙色“使用第三条路线,不会尝试以这种方式验证身份证。我是否理解您正在尝试做的事情?让我知道这种方法是否有效。
答案 1 :(得分:2)
在与数字ID匹配的IgnoreRoute之后添加IgnoreRoute,该数字ID将忽略对Customer控制器上的Details操作的任何请求:
routes.MapRoute(
"DefaultDigitsId", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index" },
new { id = @"\d+" } // match numeric id
);
routes.IgnoreRoute("Customer/Details/{*pathInfo}");
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
);
答案 2 :(得分:0)
任何无法解析为字符串的值都会使id值在调用时为null,因此如果id不为null,您可以重定向到错误页面。
另一种可能性是注册一个全局过滤器,检查是否有一个名为id的参数,如果它是null,则重定向到错误页面