在路由参数不工作MVC 3(parameters in routing do not work MV

2019-09-20 20:17发布

我相信,我做错了什么,但在这花了几个小时,没有运气后,我会很高兴,如果有人能帮助我了这一点。

好像路由系统荣誉仅在第一路由注册的参数。

这是我的global.asax.cs看起来像

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;

namespace MvcApplication4
{


    public class MvcApplication : System.Web.HttpApplication
    {
        public static void RegisterGlobalFilters(GlobalFilterCollection filters)
        {
            filters.Add(new HandleErrorAttribute());
        }

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

            routes.MapRoute(
                     "t", // Route name
                     "{controller}/{action}/{i}/{v}",  
                     new { i = UrlParameter.Optional, v = UrlParameter.Optional }  
                 );

            routes.MapRoute(
                "Default", // Route name
                "{controller}/{action}/{id}", 
                new {  id = UrlParameter.Optional } 
            );





        }

        protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();

            RegisterGlobalFilters(GlobalFilters.Filters);
            RegisterRoutes(RouteTable.Routes);
        }
    }
}

这是家居控制器的模样

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace MvcApplication4.Controllers
{
    public class HomeController : Controller
    {
        public ActionResult Index(int? id)
        {
            ViewBag.Message = "Welcome to ASP.NET MVC!";

            return View();
        }

        public ActionResult About(int? a)
        {
            return View();
        }



    }
}

问题是,当我尝试这个网址

http://localhost:52230/Home/Index/2

该ID总是空。 但是,如果我尝试http://localhost:52230/Home/Index?id=2 ....它的作品。

如果我的任何其他途径之前注册主页/指数它还适用。 在这种情况下后面登记的路由具有在接受参数的同样的问题。

我在做什么错在这里?

更新:

我想这两个控制器工作,如何将我的路线注册是什么样子?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace MvcApplication4.Controllers
{
    public class HomeController : Controller
    {
        public ActionResult Index(int? id)
        {
            ViewBag.Message = "Welcome to ASP.NET MVC!";

            return View();
        }




    }
}

第二控

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace MvcApplication4.Controllers
{
    public class VisitorController : Controller
    {
        //
        // GET: /VisitorSecurityPoints/


        public ActionResult Test(string i,string v)
        {

            return View();
        }

    }
}

Answer 1:

该路由下令从特殊到一般。 这意味着MVC将始终尝试在已请求的URL时,寻找匹配的最具体的路线。 该航线将变得更加“贪婪”的进一步下跌的路由列表他们。

如果我们在讨论的两条路线仔细一看,我们可以看到,有没有办法MVC两者之间区分,除非v参数提供。 它们都具有controlleraction参数,并且他们还有一个可选的第三个参数。 如果v不提供,MVC将无法知道使用哪种路线,除非这样的优先权制度已经到位的方式,这就是为什么路由的路由表中的顺序是非常重要的。

有办法让MVC两条路线这样的区分,但是它依赖于所讨论的参数的数据类型。 例如,如果i是一个DateTime ,而不是int ,你可以添加一个路由约束仅匹配的日期。 请参阅此文章有关约束的更多信息。

我也是第二理查德的建议使用RouteDebugger。 这是非常宝贵的帮助,了解像这样的情况,可能会导致更清洁的路由表的设计。

编辑

我还要提到的是,URL的原因“作品”,当你标记?id=2的结束是因为MVC尝试直接建模绑定到查询字符串匹配动作参数。 但是,请注意匹配的路由参数将优先于查询字符串提供的值。 例如,使用以下路线:

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

导航到http://localhost:50754/home/index/2将导致id为2。
导航到http://localhost:50754/home/index/?id=4将导致id为4。
导航到http://localhost:50754/home/index/2?id=4将导致id为2。

评论后更新

为您解决特定问题的最简单的方法是改变路由表包括以下途径:

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

    routes.MapRoute(
        "visitors", // Route name
        "visitor/{action}/{i}/{v}", // URL with parameters
        new
        {
            controller = "Visitor", action = "Test",
            i = UrlParameter.Optional, v = UrlParameter.Optional
        }
    );

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

注意{action}参数仍然存在于这条新航线。 这使事情变得更容易一些就可以了扩大以满足在控制器的其他行动。 如果你需要的路线限制在所存在的控制器上的操作,你需要如前所述添加路由约束。

一个需要注意这种方法是路由表可以很迅速成长,如果你不断地specifiying新航线,以满足一些网址。 这可以增加新的功能,以一个网站,因为现有的路由的更加困难,也可以使维护更加困难。 只要有可能,应尽量设计相匹配的默认路由{controller}/{action}/{id}因为它使得维护和调试,从而更容易在长期运行路线。



Answer 2:

我相信它,因为你的另一条路线(“T”)首先匹配。



Answer 3:

您可以检查哪些路由正在通过匹配RouteDebugger 。 只要使用的NuGet安装它:

PM> install-package RouteDebugger

当您查看的页面,它会列出您所有的路线,并指出已匹配的哪个(些)。 第一个匹配的路由将被使用。



文章来源: parameters in routing do not work MVC 3