我想将控制器下的所有操作重定向到其索引操作 (控制器,其他控制器将保持默认行为)
例如对于控制器" O"
http://foo.com/o/abc
http://foo.com/o
http://foo.com/o/abc?foo=bar
所有上述请求都将转到" index"动作
我尝试使用以下路线设置,但当我尝试访问" http://foo.com/o/abc"时,ASP.NET会抱怨404。
routes.MapRoute(
name: "ORoute",
url: "o/*",
defaults: new { controller = "O", action = "Index" });
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
由于
答案 0 :(得分:0)
试试这个 -
routes.MapRoute(
"O",
"O/{action}",
new { controller = "O", action = "Index" }
);
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new {controller = "Home", action = "Index", id = UrlParameter.Optional} // Parameter defaults
);
路线的顺序会改变一切。另外,请注意我对O路线所做的更改。第一个参数是路径的名称。第二个是URL,它匹配以O开头的URL,并允许在O控制器中执行其他操作。如您所见,它将默认为Index操作。
答案 1 :(得分:0)
首先,定义名为Error with One Action的控制器,该控制器显示Customized Invalid Address页面。
然后,您需要使用inherit DefaultControllerFactory定义一个Class (它的名字是CF)
然后你应该覆盖它的Main方法:CreateController
最后,将此语句添加到global.asax,这意味着任何请求都应该由此类验证。
CF类代码:
public class CF : DefaultControllerFactory
{
public override IController CreateController(RequestContext requestContext, string controllerName)
{
IController result;
try
{
result = base.CreateController(requestContext, controllerName);
}
catch (Exception)
{
result = base.CreateController(requestContext, "Error");
}
return result;
}
}
Global.asax:
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
GlobalConfiguration.Configure(WebApiConfig.Register);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
// Here is the Change
ControllerBuilder.Current.SetControllerFactory(typeof(CF));
}