ASP.NET MVC Маршрут соответствия для дочерних действий - PullRequest
8 голосов
/ 29 июля 2011

Отличается ли подход сопоставления маршрутов для дочерних действий от обычных действий?Другими словами, имеют ли дочерние действия какой-то автоматически сгенерированный URL, чтобы сопоставление было похоже на то, что делается для родительских действий?

1 Ответ

9 голосов
/ 04 августа 2011

Нет разницы между обработкой родительского или дочернего действия

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

Избегайте обработки маршрута, преобразовав в Html.RenderPartial()

Если вы, конечно, можете ... Дочерние действия проходят ту же обработку MVC, что и родительские действия.Это, конечно, отличается, если вы можете изменить Html.RenderAction() на Html.RenderPartial().Они не проходят ту же обработку, следовательно, намного быстрее.Используйте Html.RenderAction() только в том случае, если вы не можете сделать это каким-либо другим способом или сделать это другим способом, что будет означать хакерство (повышенная сложность типа модели представления и т. Д.).

Фактический Html.RenderAction() Отрывок кода

Если вы посмотрите на код Html.RenderAction(), он вызывает контекстную обработку, чтобы выполнить, как если бы запрос был отправлен на сервер:

// other code before this
RouteData routeData = CreateRouteData(data.Route, routeValues, data.DataTokens, htmlHelper.ViewContext);
HttpContextBase httpContext = htmlHelper.ViewContext.HttpContext;
RequestContext context = new RequestContext(httpContext, routeData);
ChildActionMvcHandler httpHandler = new ChildActionMvcHandler(context);
httpContext.Server.Execute(HttpHandlerUtil.WrapForServerExecute(httpHandler), textWriter, true);

Мы можем убедиться, что он использует обработчик ChildActionMvcHandlerкоторый наследуется от MvcHandler, но в принципе не отличается от него с точки зрения исполнения, поскольку не имеет каких-либо новых или измененных функциональных возможностей, связанных с обработкой.Таким образом, он выполняет код MvcHandler в основном.

Outcome?

Дочерние действия выполняются как родительские действия , используя те же определения маршрутизации, сопоставление действий контроллера (селекторы метода действия), фильтрыи т.д.

...