Один URL для метода действия контроллера - PullRequest
0 голосов
/ 13 января 2012

Почему в ASP.NET MVC так много способов выбрать метод действия и как этого избежать? Я имею в виду, я могу перейти к методу действия индекса из /, / Home, / Home / Index. Я думаю, что это повлияет на рейтинг SEO.

Ответы [ 2 ]

5 голосов
/ 13 января 2012

Это связано с настройкой маршрутизации по умолчанию в Global.asax.cs:

routes.MapRoute(
            "Default",
            "{controller}/{action}/{id}",
            new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );

Это позволяет настроить маршрут со значениями по умолчанию как для контроллера, так и для действия.Таким образом:

  • /Home/Index будет сопоставлять этот маршрут с контроллером, а значения действий, явно заданные
  • /Home, будут соответствовать маршруту Default, а конфигурация маршрутизации предоставит контроллер по умолчаниюof "Home"
  • / будет соответствовать маршруту Default, а в конфигурации маршрутизации будет предоставлен контроллер по умолчанию и действие

Вы можете изменить это, удалив controller = "Home", action = "Index" изтретий аргумент MapRoute.Это удаляет значения по умолчанию и требует, чтобы URL-адрес явно указывал контроллер и действие.

Вы хотели бы, чтобы второй MapRoute вызов явно указывал маршрут домашней страницы:

// route the root URL to the home page controller/action
routes.MapRoute("HomePage", "", new { controller = "Home", action = "Index" });

В противном случае запрос к http://yourdomain.com не будет направлен на какой-либо контроллер / действиепару, и вы получите 404 вместо домашней страницы.

0 голосов
/ 28 января 2012

Цитирую ответ от этого сайта,

public class RemoveDuplicateContentAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        var routes = RouteTable.Routes;
        var requestContext = filterContext.RequestContext;
        var routeData =requestContext.RouteData;
        var dataTokens = routeData.DataTokens;
        if (dataTokens["area"] == null)
            dataTokens.Add("area", "");
        var vpd = routes.GetVirtualPathForArea(requestContext, routeData.Values);
        if (vpd != null)
        {
            var virtualPath = vpd.VirtualPath.ToLower();
            var request = requestContext.HttpContext.Request;
            if (!string.Equals(virtualPath, request.Path))
            {
                filterContext.Result = new RedirectResult(virtualPath + request.Url.Query, true);
            }
        }
        base.OnActionExecuting(filterContext);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...