MVC 3 Маршрутная проблема - PullRequest
       8

MVC 3 Маршрутная проблема

1 голос
/ 27 сентября 2011

Результат ActionLink "http://localhost:5089/Article/GetArticlesByCategory?category=ASP.NET&categoryId=2". Я хочу показать этот тип ссылки" http://localhost:5089/Blog/ASP.NET". Что такое неправильный маршрут с именем "Article".

Маршруты:

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

 routes.MapRoute(
                "Article",
                "Blog/{category}", // 
                new { controller = "Article", action = "GetArticlesByCategory", category = UrlParameter.Optional, categoryId = UrlParameter.Optional }

Ссылка:

@Html.ActionLink(k.Name, "GetArticlesByCategory", "Article",
new { category = k.Name, categoryId = k.CategoryId }, null)

решаемые

Параметр GetArticlesByCategory int categoryId изменен на >> строковую категорию и заменен кодами действий на новый параметр (строковая категория)

Маршруты заменены на:

        routes.MapRoute(
            "Category",
            "Blog/{category}",
            new { controller = "Article", action = "GetArticlesByCategory", category = UrlParameter.Optional }
        );

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

ActionLink заменен на:

@Html.ActionLink(k.Name, "GetArticlesByCategory", "Article",
new { category = k.Name }, null)

Ответы [ 3 ]

2 голосов
/ 27 сентября 2011

Есть несколько вопросов. Во-первых, и самое главное, ваши маршруты указаны в неправильном порядке. Маршрут по умолчанию должен быть определен последним. Во-вторых, никогда не определяйте маршрут с двумя необязательными параметрами. Это просто вызывает слишком много проблем.

Попробуйте следующие маршруты:

routes.MapRoute(
    "CategoryAndId",
    "Blog/{category}/{categoryId}", 
    new { controller = "Article", action = "GetArticlesByCategory" } 
);

routes.MapRoute(
    "CategoryOnly",
    "Blog/{category}", 
    new { controller = "Article", action = "GetArticlesByCategory",
        category = UrlParameter.Optional } 
);

routes.MapRoute(
    "Default", // Route name
    "{controller}/{action}/{id}", // URL with parameters
    new { controller = "Home", action = "index", 
        id = UrlParameter.Optional } // Parameter defaults
);
1 голос
/ 27 сентября 2011

Вы не указываете действие в маршруте

routes.MapRoute(
                "Article",
                "Blog/{action}/{category}/{categoryId}", // 
                new { controller = "Article", action = "GetArticlesByCategory", category = UrlParameter.Optional, categoryId = UrlParameter.Optional }

Я предлагаю вам использовать отладку маршрутов Фила Хаака, http://haacked.com/archive/2008/03/13/url-routing-debugger.aspx. Отличный способ отладки ваших маршрутов MVC

0 голосов
/ 27 сентября 2011

Если вы хотите, чтобы ссылка отображалась как http://localhost:5089/Blog/ASP.NET, вам нужно изменить ссылку действия следующим образом:

@Html.ActionLink(k.Name, "GetArticlesByCategory", "Article",
    new { category = k.Name }, new { @title = "Kategorisindeki Makaleler", @class = "selected" })

Поскольку вы не хотите указывать CategoryID в ссылке, нет необходимости указывать его. Маршрут не соответствует маршруту, поскольку он также ожидает параметр CategoryID

EDIT

Если вы хотите, чтобы CategoryID считывался из маршрута, его необходимо добавить в маршрут. в противном случае он будет просто добавлен в качестве параметра (как в исходном примере).

Если вы измените свой маршрут на:

"Blog/{categoryId}/{category}"
or
"Blog/{category}/{categoryId}"

Ссылка теперь будет выглядеть как Blog/2/ASP.NET или Blog/ASP.NET/2, но если вы хотите, чтобы categoryId читался из URL, тогда я не думаю, что у вас есть большой выбор

...