如何将所有操作重定向到一个操作

时间:2014-09-16 04:59:59

标签: .net asp.net-mvc routes

我想将控制器下的所有操作重定向到其索引操作 (控制器,其他控制器将保持默认行为)

例如对于控制器" 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 }
            );

由于

2 个答案:

答案 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));
        }