none
MVC 路由设置,影响JS执行 RRS feed

  • 问题

  • 路由设置:

        public class RouteConfig
        {
            public static void RegisterRoutes(RouteCollection routes)
            {
                routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
    
                /* 如果开启 a 路由,则js获取到的是整个view的html
                routes.MapRoute(
                    name: "a",
                    url: "{id1}/{id2}",
                    defaults: new { controller = "Home", action = "Contact", id1 = UrlParameter.Optional, id2 = UrlParameter.Optional }
                );*/
    
                routes.MapRoute(
                    name: "b",
                    url: "{controller}/{action}/{id1}/{id2}",
                    defaults: new { controller = "Home", action = "Contact", id1 = UrlParameter.Optional, id2 = UrlParameter.Optional }
                );
    
                routes.MapRoute(
                    name: "Default",
                    url: "{controller}/{action}/{id}",
                    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
                );
            }
        }

    controller:

        public class HomeController : Controller
        {
            [HttpGet]
            public string GetAbc()
            {
                return "abc";
            }
            public ActionResult Contact(string id1,string id2)
            {
                ViewBag.Message = "id1:" + id1 + "; id2:" + id2;
                return View();
            }
    
        }

    View 代码:

    @{
        ViewBag.Title = "Contact";
    }
    <h2>@ViewBag.Title.</h2>
    <h3>@ViewBag.Message</h3>

    <script type="text/javascript" src="~/Scripts/jquery-3.3.1.js"></script> <script type="text/javascript"> function getabc() { jQuery.ajax({ type: 'get', url: '/Home/GetAbc', dataType: 'text', traditional: true, success: function (returnStr) { alert(returnStr);

    //如果开启了 "a" 路由,就不能获取到 文本"abc",而是 contact 的 view页面的代码 } }); } getabc(); </script>


    2018年8月4日 2:35

全部回复

  • 你好,

    根据你的路由设置,我觉得这个是一个正常的结果。

    因为MVC路由是从上到下进行匹配的。

    当你启用路由a的时候,'Home/GetAbc’ ,就代表了id1,id2

    所以他会匹配第一个路由。

    当你有4个参数的时候才会匹配第二个路由。

     


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2018年8月7日 5:10
  • 非常的感谢您!

    路由设置:

    url: "{controller}/{action}/{id1}/{id2}",

    这里对应的URL应该是:http://localhost:55016/Home/Contact/111/222

    url: "{id1}/{id2}",

    这里对应的URL应该是:http://localhost:55016/111/222

    启用调试,运行后,输入网址:http://localhost:55016/111/222

    js弹出的信息框,不是abc,而是html代码。截图如下:

    2018年8月7日 12:28

  • 如果,路由只有一个参数,不要两个参数,则JS正常可以获取

                routes.MapRoute(
                    name: "a",
                    url: "{id1}",
                    defaults: new { controller = "Home", action = "Contact", id1 = UrlParameter.Optional }
                );

    控制器:

            public ActionResult Contact(string id1)
            {
                return View();
            }

    JS 就可以正常获取到 “abc”

    <script type="text/javascript" src="~/Scripts/jquery-3.3.1.js"></script>
    <script type="text/javascript">
        function getabc() {
            jQuery.ajax({
                type: 'get',
                url: '/Home/GetAbc',
                dataType: 'text',
                traditional: true,
                success: function (returnStr) {
                    alert(returnStr);
                    //路由只有一个参数,这里就没问题了,可以正常显示 “abc”;
                }
            });
        }
        getabc();
    </script>

    运行,输入网址:http://localhost:55016/111

    这样,信息框显示的内容,是正确的。

    就是不明白,为什么参数设置2个后,信息框显示的内容,就是错的。




    • 已编辑 fss199 2018年8月8日 14:46
    2018年8月8日 12:37
  • 你好,

    因为你的route如果设置成了{id1}/{id2},那么/home/abc就会匹配这个规则a,然后调用default设置

    如果route设置成立{id1},那么/home/abc就不会匹配这个规则a,就会匹配规则b{controller/action},所以就会成功。


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2018年8月9日 5:29
  • 那带两个参数的路由,{id1}/{id2},要怎么设置?
    • 已编辑 fss199 2018年8月9日 8:05
    2018年8月9日 8:04
  •             routes.MapRoute(
                    name: "a",
                    url: "{id1}",
                    defaults: new { controller = "Home", action = "Contact", id1 = UrlParameter.Optional }
                );

    如果是一个参数,运行,输入网址:http://localhost:55016/111,那么MVC 执行会正常

    routes.MapRoute(
                    name: "a",
                    url: "{id1}/{id2}",
                    defaults: new { controller = "Home", action = "Contact", id1 = UrlParameter.Optional, id2 = UrlParameter.Optional }
                );

    其实我郁闷的是,如果是两个个参数,运行,输入网址:http://localhost:55016/111/222,那么MVC 执行就不正常

    2018年8月14日 12:07