ASP.NET MVC слишком умный со своим файлом маршрутизации, и я не вижу, как! - PullRequest
1 голос
/ 22 января 2009

У меня есть два правила маршрутизации в приложении ASP.NET MVC:

            routes.MapRoute(
               "Products AJAX",
               "Products/Ajax/{action}",
               new { controller = "Products" }
            );

            routes.MapRoute(
               "Product",                                             
               "Products/{id}",                                        
               new { controller = "Products", action = "ViewProduct", id = "1001" }  
            );

Второе правило здесь позволяет мне создать URL /Products/1002 для просмотра продукта 1002. Это оригинальное единственное правило, которое я создал.

Я хотел добавить AJAX в представление, чтобы он мог получить простую строку:

 public class ProductsController : Controller {
    public ContentResult GetStatus()
        {
            return new ContentResult()
            {
                Content = "Status is OK at " + DateTime.Now.ToLongTimeString()
            };
        }
  }

Вот почему я добавил первое правило маршрутизации выше. Я хотел, чтобы это был более конкретный URL, который можно использовать для перехода к любым другим действиям, определенным в моем контроллере. (Если бы у меня не было этого правила, он попытался бы найти продукт с SKU «GetStatus», который не годится!)

Так что я подумал, что все в порядке, мне просто нужно написать свою команду AJAX в моем представлении как:

<%= Ajax.ActionLink("Update Status", "AJAX/GetStatus", new AjaxOptions { UpdateTargetId = "status" })%>

Я предполагал, что это вызовет ссылку Products/AJAX/GetStatus, которая вызовет первое правило маршрутизации и правильно перейдет к методу GetStatus моего контроллера.

К моему удивлению, URL-адрес при наведении указателя мыши на эту команду в Internet Explorer (или в исходном коде) становится /Products/AJAX/AJAX/GetStatus.

Итак, я думаю о том, что нужно, и возвращаюсь, чтобы выполнить какую-то детективную работу.

Я изменяю свое первое правило на:

MapRoute(
               "Products AJAX",
               "Products/Foo/{action}",
               new { controller = "Products" }
            );

и я изменяю свое действие на

<%= Ajax.ActionLink("Update Status", "GetStatus", new AjaxOptions { UpdateTargetId = "status" })%>

К моему изумлению, URL, сгенерированный для этого ActionLink, на самом деле является / Products / Foo / GetStatus. Это основано на моем первом правиле, которое корректно пересылается моему обработчику AJAX, и все прекрасно работает. И, конечно, ссылка на / Products / 1003 будет соответствовать второму правилу и перейдет к продукту 1003.

Моя заявка завершена! Я счастлив - вроде как.

Но я не знаю почему! ЕДИНСТВЕННОЕ место во всей моей кодовой базе, где у меня есть Foo, находится в моем правиле отображения, так как же Ajax.ActionLink может выяснить, что я хочу эту ссылку?

Очевидно, что происходит какое-то «умное» обратное отображение. Я не могу найти какую-либо документацию по этому поводу и хотел бы узнать больше.

Я думаю, это должно быть парсинг ПЕРВОГО найденного правила или что-то в этом роде, но это кажется немного пугающим, так как мне нравится знать, что происходит.

Примечание: очень хорошая статья о маршрутизации - включая создание URL-адресов из таблицы маршрутизации в блоге ScottGu. К сожалению, я не могу найти объяснение того, что происходит в моей ситуации в этом блоге.

Ответы [ 2 ]

1 голос
/ 22 января 2009

Поскольку у вас есть названный маршрут, почему бы не использовать его? Вместо этого используйте Ajax.RouteLink и укажите имя маршрута. Тогда вам не нужно беспокоиться о том, что ASP.NET «угадает» неправильный маршрут. Ничего не повредит, что это тоже быстрее .

0 голосов
/ 22 января 2009

Да, в этом суть помощника ActionLink и маршрутизации - если вы измените всю структуру маршрутизации, вам нужно будет обновить ее только в одном месте, а ActionLinks продолжит генерировать правильные URL.

Более подробно, когда вы используете помощник ActionLink, вы, по сути, говорите системе "Связь с контроллером и действием", мне все равно как это сделано "

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...