2009-12-21 31 views
0

如果我有一个路线:如何在ASP.NET MVC中使用通用路由,但处理未知操作?

routes.MapRoute(
    "RouteName",           // route name 
    "{action}",            // url with parameters 
    new { controller = "Home", action = "Index", id = "" } // parameter defaults 
); 

我希望能够赶上形式的网址:

http://sitename.com/about 
http://sitename.com/contact 
http://sitename.com/others 

时携带的名称Home控制器中存在一个动作,这显然作品所需的URL。如果我输入错误的URL,如http://sitename.com/foo,并且foo操作在主控制器中不存在,我想将应用程序指向404页面未找到,但显然如果我输入foo,它正在寻找foo家庭控制器内的行动。如果没有将所有子页面硬编码到global.asax中,是否有任何方法保持通用。如果可能,我想避免:

routes.MapRoute(
    "About",            // route name 
    "about",            // url with parameters 
    new { controller = "Home", action = "About", id = "" } // parameter defaults 
); 

routes.MapRoute(
    "Contact",            // route name 
    "contact",            // url with parameters 
    new { controller = "Home", action = "Contact", id = "" } // parameter defaults 
); 

谢谢。

+0

你有没有考虑使用自定义错误页,当他们进入一个无效的URL(其他错误中)的用户,其重定向到一个特定的位置? http://msdn.microsoft.com/en-us/library/h0hfz6fc(VS.71).aspx – Omar 2009-12-21 17:36:05

+0

是啊,我还说到web.config中,但愚蠢的将它设置为仅限远程。对不起,混音。这个问题可以关闭。 – user135383 2009-12-21 17:44:20

回答

2

您是否尝试过使用约束带一个路线?这将允许您匹配在顶层的家庭(或其他)控制器上存在的任何操作。

routes.MapRoute(
     "TopLevelGeneric", 
     "{action}", 
     new { controller = "Home", action = "Index", id = "" }, 
     new { 
       action = new MatchesHomeControllerConstraint() 
      }); 

其中MatchesHomeControllerConstraint是:

public class MatchesHomeControllerConstraint : IRouteConstraint 
{ 
    public bool Match(HttpContextBase httpContext, 
         Route route, 
         string parameterName, 
         RouteValueDictionary values, 
         RouteDirection routeDirection) 
    { 
      var name = values[parameterName] as string; 
      var method = typeof(HomeController).GetMethod(name,BindingFlags.IgnoreCase); 
      return method != null 
        && method.ReturnType.IsAssignableFrom(typeof(ActionResult)); 
    } 
} 
+0

实际上,我可能会缓存一组控制器操作,并与缓存集匹配。尽管如此,为了简单起见,我正在离开实施。 – tvanfosson 2009-12-21 17:50:05

+0

不,我没有试过这个。虽然很聪明。谢谢! – user135383 2009-12-21 17:58:56

0

也许我没有正确理解你的问题,但是,你必须在你的问题中顶部的路线将覆盖已经你在底部打字的情况下。没有必要像这样明确地定义它们。如果他们键入一个不存在的操作,将会抛出一个404错误。

如果你想要做一些特别的东西,当有人相匹配的有效控制,但并没有提供一个有效的行动,我们可以覆盖在你的控制器HandleUnknownError

相关问题