【问题标题】:ActionLink to show parameters in URL instead of querystring?ActionLink 在 URL 中显示参数而不是查询字符串?
【发布时间】:2014-12-16 08:17:02
【问题描述】:

我已经定义了这条路线:

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
               );

动作链接:

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

actionlink 结果是/Home/Details/1?name=a 我在/Home/List/1/a之后

【问题讨论】:

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


    【解决方案1】:

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

    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

    【讨论】:

    • 在默认路由之前添加上述路由时,actionlink 工作正常。但是,现在默认转到 /Home/Details
    【解决方案2】:

    一个疯狂的猜测:

    可能您的路线是在默认路线之后注册的。将它作为第一条路线放在你的 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
            );
    
        }
    

    更新

    @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")
                           }
                       );
    

    【讨论】:

    • @Danny “现在默认转到 /Home/Details”是什么意思?
    • 当应用程序启动时,它会转到 /Home/Details 而不是默认路由 /Home/Index
    • 那是因为您将 id 和 name 标记为可选,所以如果它们为空则匹配。
    • @SimonHalsey 是正确的,但也请参阅我的更新答案以获得另一个解决方案。 (在这种情况下不是最好的,但有时可能会派上用场)
    猜你喜欢
    • 1970-01-01
    • 2016-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多