TL; DR @Html.RenderAction()
не зависит от ваших маршрутов. Он попытается напрямую вызвать действие WidgetController.Widget()
. Это действие, а также любой промежуточный код, такой как IControllerFactory
или IActionFilter
, может использовать ваш routeValues
словарь, чтобы оценить вашу настраиваемую переменную маршрута wAction
и ответить соответствующим образом. Это может включать вызов вашего действия WidgetController.GetWorldMapMethod()
.
Крайне важно, ASP. NET MVC не выполняет маршрутизацию и не вызывает ваш GetWorldMapMethod()
; вместо этого он запускается чем-то в вашем коде .
Полный ответ
Как отмечает @Always_a_learner в комментариях, без доступа к коду вашего контроллера мы не можем дать точный ответ. Тем не менее, мы можем по крайней мере предоставить некоторую справочную информацию и связать ее с обоснованным предположением о том, что может происходить.
Маршрутизация дочерних действий
Во-первых, это Важно отметить, что хотя @AbdulG запросил ваши RouteConfig
данные, они здесь не актуальны. @Html.RenderAction()
требует параметра actionName
и, необязательно, принимает controllerName
, таким образом обходя любые настроенные вами маршруты. Фактически, поскольку RenderAction()
предназначен для рендеринга дочернего действия , не имеет смысла иметь связанный с ним маршрут publi c .
Учитывая, что, независимо от вашей конфигурации MapRoute()
, мы можем быть уверены, что ваш вызов @Html.RenderAction()
сначала попытается выполнить действие с именем WidgetController.Widget()
.
Примечание: Существуют расширенные сценарии - , такие как реализация пользовательского IControllerFactory
- где это предположение может быть неверным, поэтому вы должны подтвердить, что нет, например, SetControllerFactory()
регистрация в вашем Global.asax.cs
. Если есть, он потенциально может перехватить запрос и направить его в отдельное действие.
Обработка данных маршрута
Во-вторых, третий параметр this @Html.RenderHtml()
overload представляет ваш routeValues
. Таким образом, действие Widget()
, а также любой промежуточный код, такой как IControllerFactory
или любые фильтры действий , будут иметь доступ к этим значениям для реализации любых бизнес-логик c, которые они сочтут соответствующий. Это может потенциально включать вызов другого действия .
Учитывая это, я предполагаю, что где-то в этом конвейере будет код, который выглядит примерно так:
var wAction = ControllerContext.RouteData.GetRequiresString("wAction");
switch (wAction) {
case "GetWorldMapMethod":
GetWorldMapMethod();
break;
default:
break;
}
Примечание: Это просто пример. Существуют десятки различных подходов к оценке содержимого RouteData
и реагированию на него, включая, например, отражение. Тем не менее, если вы ищете wAction
в базе кода, это должно помочь вам определить, какой код обрабатывает это значение маршрута.
Отладка
Если вы используете IDE как и Visual Studio, самым простым решением было бы запустить отладчик, добавить точку останова к вашему вызову @Html.RenderAction()
и пройти через конвейер выполнения. Это откроет доступ к любой расширенной функциональности, такой как применяемый промежуточный код IControllerFactory
или IActionFilter
, а также позволит вам точно определить, когда и где код вызывает ваше действие GetWorldMapMethod()
.
Заключение
Как отмечено вверху, я боюсь, что я не могу дать конкретный ответ на то, как именно ваш GetWorldMapMethod()
получает вызов, на основе предоставленной информации. Но, надеюсь, этот ответ предоставит вам solid достаточную основу для понимания переменных и обратного проектирования базы кода, с которой вы работаете.
Если вы можете продолжить работу с кодом своего контроллера, я Буду рад дополнить этот ответ более подробным c руководством.