如何控制ASP.NET MVC中使用的Action

时间:2013-07-02 07:24:47

标签: asp.net-mvc asp.net-mvc-routing

我有一个设置,我使用以下格式的url的一个路由:

www.example.com/friendly-url-1

www.example.com/friendly-url-2

www.example.com/another-friendly-url

路线的定义如下:

routes.MapRoute("FriendlyUrl", "{name}",
             new { controller = "FriendlyUrl", action = "Index", name = UrlParameter.Optional }
         );    

Name是我的应用程序中的一个内部属性,它允许我查找应在自定义ControllerFactory中使用哪个控制器,并更改所创建的控制器的名称(没有名为FriendlyUrl的实际控制器)。

如果每个控制器只有一个动作,它会很好用,但由于动作不是路径的一部分,所以它总是使用默认动作。我想要有多个动作,但是我找不到一个好的方法让我编写逻辑来控制每个请求应该使用哪个动作。有可能吗?

2 个答案:

答案 0 :(得分:1)

如果我正确理解,您的网址格式为“www.example.com/friendly-url/name”,并希望name确定两个控制器和操作,例如

  • “example.com/friendly/foo”将解析为SomeControllerXxxAction
  • “example.com/friendly/boo”将解析为AnotherControllerZzzAction

我认为,最简单的方法是使用自定义路由处理程序

public class MyRouteHander : IRouteHandler
{
    public IHttpHandler GetHttpHandler(RequestContext requestContext)
    {
        var values = requestContext.RouteData.Values;
        var token = GetRequestToken(requestContext); 
        switch (token) {
           case "friendly/foo") {
            values["controller"] = "some";
            values["action"] = "xxx";
            break;
           case "friendly/boo") {
            values["controller"] = "another";
            values["action"] = "zzz";
            break;
           ...
        }
        return new MvcHandler(requestContext);
    }
}

然后用

注册处理程序
routes.MapRoute(
    "Default",
    "{controller}/{action}/{id}",
    new { controller = "Home", action = "Index", id = UrlParameter.Optional }
).RouteHandler = new MyRouteHander();

答案 1 :(得分:0)

您可以为您的网址编写专用路线,在这种情况下,它会调用不同的操作。但是如果你想使用表达式路由到不同的动作我不认为你可以通过在routeConfig中写路由来直接做,因为你需要在某处指定URL Segment到Action的映射,这相当于创建专用路由在routeConfig