ASP.NET MVC路由和URL.Action

时间:2011-09-20 16:35:51

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

在我的一个asp.net mvc 2视图中,我有以下声明

window.location.href = '<% = Url.Action("Index","Feature", new {id=""}) %>/' + $("#ProductId").val();

可以看出$(“#ProductId”)。val()只能从客户端操作计算出来,所以在url.Action之外

我的路线如下所示:

 public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
            routes.IgnoreRoute("{*allaspx}", new { allaspx = @".*\.aspx(/.*)?" });
            routes.IgnoreRoute("{*favicon}", new { favicon = @"(.*/)?favicon.ico(/.*)?" });
            routes.IgnoreRoute("{*allimages}", new {allimages = @".*\.jpg(/.*)?"});
           routes.MapRoute(
              "Default", // Route name
              "{controller}.mvc/{action}/{id}", // URL with parameters
              new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
          );


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


        }

使用Url.Action的请求失败,因为路由认为“action”是“id” enter image description here

如何确保“DefaultIndex”中的路由配置已验证且网址为

键&gt;&gt;值
controller =功能
action = index
id = 9a1347dc-60b0-4b3b-9570-9ed100b6bc6a

修改2

图片2:

enter image description here

修改1-路线订单

我几乎以为我通过改变路线顺序来解决它

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



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



            routes.MapRoute("Root", "", new { controller = "Home", action = "Index", id = "" });
它确实起作用了 http://localhost:61000/Feature.mvc/9a1347dc-60b0-4b3b-9570-9ed100b6bc6a/

但同一页面上的帖子失败

http://localhost:61000/Product.mvc/List

****历史****

一直在使用+ $(“#ProductId”)。val(); =“/ domainname [虚拟目录别名] /Fewature.mvc/Index”+ $(“#ProductId”)。val();

总是有效,但我必须在发布到服务器域名[虚拟目录别名] /从开发到测试再到生产时更改所有脚本

试图简化它:

先前有以下声明:

window.location.href ='&lt;%= Url.Action(“Index”,“Feature”})%&gt; /'+ $(“#ProductId”)。val();

会产生多个Id值

http://localhost:61000/Feature.mvc/9a1347dc-60b0-4b3b-9570-9ed100b6bc6a/3c5941e4-cb25-4d6f-9117-9ed100b4ca91

它将现有路线{id}映射到Url.Action(“索引”,“功能”}

导致NoMatch

介绍

新{id =“”} 来解决它。

2 个答案:

答案 0 :(得分:2)

尝试使用Url.RouteUrl

window.location.href = '<%= Url.RouteUrl("Default", new { @Controller = "Feature", @Action = "Index"}) %>/' + $("#ProductId").val();

答案 1 :(得分:1)

你的路由都搞砸了。第二条路线的原因是什么:{controller}.mvc/{id} ......?它与第一条路线发生冲突。

如果路由引擎中出现/mycontroller/9a1347dc-60b0-4b3b-9570-9ed100b6bc6a之类的网址,则会始终将其路由到{controller}/{action}/{id},因为它是列表中的第一个,并且网址可以映射到该路由,即没有路由限制, id是可选的。

如果我是你,我会删除第二条路线...如果你真的需要第二条路线,那么将它移到第一条路线上方,然后对它施加路线约束。