asp mvc, используя тире в именах контроллеров и маршрутизации? - PullRequest
4 голосов
/ 20 января 2011

У меня есть два вопроса. Я довольно новичок в MVC и люблю новый способ настройки контроллера и представлений, но я не могу понять, как сделать следующее:

1) создайте URL-адрес, например www.homepage.com/coming-soon

для этого типа URL, как правильно это сделать? Вы создаете контроллер с именем ComingSoonController и каким-то волшебным образом вставляете тире через маршрутизацию? обратите внимание, я не хочу подчеркивания, поскольку это не в интересах SEO. или скоро появится какое-нибудь имя действия на каком-то другом контроллере, которого нет в URL, и использовать атрибут [ActionName ("name-with-dash")]?

2) Facebook, linkedin и Twitter имеют URL-адреса, такие как www.facebook.com/[profile name]. Как это будет сделано в MVC? очевидно, [имя профиля] является динамическим. и код, очевидно, будет жить в контроллере, называемом, например, профилями. так что мне кажется, что вам нужно сделать MVC достаточно умным, чтобы знать, когда эта вторая часть URL-адреса является именем профиля, а НЕ контроллером, и направить его к нужному действию на контроллере профилей? это проще, чем кажется?

Ответы [ 3 ]

3 голосов
/ 03 февраля 2011

Вы можете создать собственный обработчик маршрута, разрешив дефисы в URL:

Создать новый обработчик

public class HyphenatedRouteHandler : MvcRouteHandler{
        protected override IHttpHandler  GetHttpHandler(RequestContext requestContext)
        {
            requestContext.RouteData.Values["controller"] = requestContext.RouteData.Values["controller"].ToString().Replace("-", "_");
            requestContext.RouteData.Values["action"] = requestContext.RouteData.Values["action"].ToString().Replace("-", "_");
            return base.GetHttpHandler(requestContext);
        }
    }

... и новый маршрут:

routes.Add(
            new Route("{controller}/{action}/{id}", 
                new RouteValueDictionary(
                    new { controller = "Default", action = "Index", id = "" }),
                    new HyphenatedRouteHandler())
        );

MVC Перенесенные URL-адреса

3 голосов
/ 03 августа 2013

Я разработал библиотеку NuGet с открытым исходным кодом для первой проблемы, которая неявно преобразует EveryMvc / Url в every-mvc / url.

Пунктирные URL-адреса намного удобнее для SEO и их легче читать. ( Больше на моем блоге )

Пакет NuGet: https://www.nuget.org/packages/LowercaseDashedRoute/

Чтобы установить его, просто откройте окно NuGet в Visual Studio, щелкнув правой кнопкой мыши Project и выбрав диспетчер пакетов NuGet, и на вкладке «Онлайн» введите «Строчный пунктирный маршрут», и он должен появиться.

Кроме того, вы можете запустить этот код в консоли диспетчера пакетов:

Install-Package LowercaseDashedRoute

После этого вы должны открыть App_Start / RouteConfig.cs и закомментировать существующий маршрут. ВызовMapRoute (...) и добавить вместо этого:

routes.Add(new LowercaseDashedRoute("{controller}/{action}/{id}",
  new RouteValueDictionary(
    new { controller = "Home", action = "Index", id = UrlParameter.Optional }),
    new DashedRouteHandler()
  )
);

Вот и все. Все URL-адреса строчные, пунктирные и неявно преобразуются без каких-либо дополнительных действий.

URL проекта с открытым исходным кодом: https://github.com/AtaS/lowercase-dashed-route

Когда дело доходит до второй проблемы, вы можете сделать это либо путем создания собственных маршрутов, либо путем обработки, не найденной с помощью специального механизма обработки ошибок, но маршрутизация будет быстрее, если вы ограничите URL-адреса профиля для согласования с некоторыми правилами ( например, не имеет косых черт), чтобы вы могли намного легче отличить его от других URL-адресов, например, от URL-адресов файлов содержимого, например .css .js и т. д.

3 голосов
/ 20 января 2011

1) Это зависит от того, будет ли динамично изменяться или нет.Я предполагаю, что это так и предложил бы что-то вроде этого:

Global.asax

public static void RegisterRoutes(RouteCollection routes)
{
 routes.MapRoute(
                "Page", // Route name
                "{pageName}", // URL with parameters
                new { controller = "Home", action = "Page"} // Parameter defaults
             );

}

public class HomeController : Controller
{

 public ActionResult Page(string pageName)
 {
  return View();
 }
}

2) Вы можете решить эту проблему так же, как я показал выше, но имейте в виду,этот порядок маршрутов важен.И тот, который соответствует, побеждает.Если вы хотите два действия, которые имеют различную логику, но схожую структуру URL-адресов, www.mysite.com/coming-soon и www.mysite.com/ enjprofile name}, предполагая, что первый URL-адрес имеет статическую часть, а последующий динамический, вы можете сделать что-то вродеэто:

Global.asax

public static void RegisterRoutes(RouteCollection routes)
{
 routes.MapRoute(
                "Coming-soon", // Route name
                "coming-soon", // URL with parameters
                new { controller = "Home", action = "ComingSoon" } // Parameter defaults
             );

 routes.MapRoute(
                "Profiles", // Route name
                "{profileName}", // URL with parameters
                new { controller = "Home", action = "Profile"} // Parameter defaults
            );
}

public class HomeController : Controller
{
 public ActionResult ComingSoon()
 {
  return View();
 }

 public ActionResult Profile(string profileName)
 {
  return View();
 }

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