使用本机RegisterRoutes创建优雅的URL以避免查询字符串

时间:2012-05-21 20:15:45

标签: c# asp.net-mvc-3 routes friendly-url

这是当前为属性详细信息页面生成的网址。

http://localhost:61346/Property/Details?strap=0001020005

我想要阅读

http://localhost:61346/Property/Details/0001020005

这是我的注册路线。这是在MVC3中设置简单吗?解释如何为此格式设置“RegisterRoutes”的额外要点

http://localhost:61346/Property/0001020005< - 只需隐藏操作名称

        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");


            routes.MapRoute(
                   "Property", // Route name
                   "{controller}/{action}/{ParcelId}", // URL with parameters
                   new { controller = "Property", action = "List", ParcelId = 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
            );

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


        }

2 个答案:

答案 0 :(得分:1)

如果您移除DetailsProperty路由,并将DetailsList操作方法更改为接受string id作为参数,则默认路由应该选择那种格式。您的Property路由与默认路由冲突。

您需要的格式与默认路由兼容。您只需要更改您的参数名称以适应处理它。

public ActionResult Details(string id){...}

public ActionResult List(string id){...}

public static void RegisterRoutes(RouteCollection routes)  {
  routes.IgnoreRoute("{resource}.axd/{*pathInfo}");    
  routes.MapRoute(
                 "Default", // Route name
                 "{controller}/{action}/{id}", // URL with parameters
                 new { controller = "Home", action = "Index", id =UrlParameter.Optional  
                 });
}

答案 1 :(得分:1)

要更清楚地映射您的网址,您只需将网址中的值映射到操作方法中的参数。由于您使用的是strap,因此您需要一条映射它的路线,就像您的“物业”路线一样:

routes.MapRoute( 
    "PropDetails", // Route name 
    "{controller}/{action}/{strap}", // URL with parameters 
    new { controller = "Property", action = "Details" }
);

但请注意,您的路线将按照您定义它们的顺序使用。因此,在您列出的内容中,DefaultDetails将永远不会被使用,因为Property会抓住所有内容。相反,你可能想要更像的东西:

routes.MapRoute( 
    "PropDetails", // Route name 
    "Property/Details/{strap}", // URL with parameters 
    new { controller = "Property", action = "Details" }
);

这将确保只有与/Property/Details/{strap}匹配的路线会受到影响(例如您的示例网址),并且/Something/Else/不会产生误报。

要回答关于{id}的问题,这只是路线中定义的内容。您可以根据需要命名,例如{strap}。但是,如果您重写操作方法以接受string ID,那么您将丢失查询字符串而无需修改路由。

public ActionResult Details (string id) { ... }  // Don't have to modify your routes
public ActionResult Details (string strap) { ... } // Have to modify your routes to remove the querystring