2011-09-21 92 views
10

我已经定义了这条路线:ActionLink在URL中显示参数而不是查询字符串?

routes.MapRoute(
        "Details", // Route name 
        "{home}/{details}/{id}/{name}", // URL with parameters 
        new 
        { 
         controller = "Home", 
         action = "Details", 
         id = UrlParameter.Optional, 
         name = UrlParameter.Optional 
        } // Parameter defaults 
       ); 

的ActionLink的:

@Html.ActionLink("Show Details", "Details", "MyController", new { id = 1, name ="a" }) 

的ActionLink的结果/Home/Details/1?name=a我以后/Home/List/1/a

回答

12

你的路由定义应该是这样的:

routes.MapRoute(
    "Details", // Route name 
    "{controller}/{action}/{id}/{name}", // URL with parameters 
    new 
    { 
     controller = "Home", 
     action = "Details", 
     id = UrlParameter.Optional, 
     name = UrlParameter.Optional 
    } // Parameter defaults 
); 

另外你应该使用proper overload

@Html.ActionLink(
    "Show Details",    // linkText 
    "Details",     // action 
    "MyController",    // controller 
    new { id = 1, name = "a" }, // routeValues 
    null      // htmlAttributes 
) 

通知的null底。

+1

的ActionLink的工作得很好,当默认路由前加入上述路线。但是,默认现在去/首页/详细信息 – Danny

1

疯狂的猜测:

可能你的路由是在默认路由后注册的。把它作为你的global.asax内的第一条路线,那么它将起作用。

象下面这样:

public static void RegisterRoutes(RouteCollection routes) { 

     routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

     routes.MapRoute(
          "Details", // Route name 
          //Put action instead of details 
          "{home}/{action}/{id}/{name}", // URL with parameters 
          new 
          { 
           controller = "Home", 
           action = "Details", 
           id = UrlParameter.Optional, 
           name = UrlParameter.Optional 
          } // Parameter defaults 
         ); 

     routes.MapRoute(
      "Default", // Route name 
      "{controller}/{action}/{id}", // URL with parameters 
      new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults 
     ); 

    } 

UPDATE

@Simon是正确的,但如果你愿意,你可以用另外一种方式。

为了让路线仅适用于一个操作方法,请使用以下代码。

创建一个约束条件如下:

public class EqualConstraint : IRouteConstraint { 

    private string _match = String.Empty; 

    public EqualConstraint(string match) { 

     _match = match; 
    } 

    public bool Match(System.Web.HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection) { 

     return string.Equals(values[parameterName].ToString(), _match); 
    } 
} 

,然后更改像下面路线:

routes.MapRoute(
         "Details", // Route name 
         //Put action instead of details 
         "{home}/{action}/{id}/{name}", // URL with parameters 
         new 
         { 
          controller = "Home", 
          action = "Details", 
          id = UrlParameter.Optional, 
          name = UrlParameter.Optional 
         }, // Parameter defaults 
         new { 
          controller = new EqualConstraint("Home"), 
          action = new EqualConstraint("Details") 
         } 
        ); 
+0

看到我对达林的评论 – Danny

+0

@丹尼你是什么意思的“默认现在去/首页/详细信息”? – tugberk

+0

当应用程序启动到/ Home/Details,而不是默认路由/ Home/Index – Danny

相关问题