У меня есть два правила маршрутизации в приложении 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. К сожалению, я не могу найти объяснение того, что происходит в моей ситуации в этом блоге.