Не удается закодировать значение данных маршрута при перезаписи URL-адреса в RouteConfig в ASP.Net MVC

Я разрабатываю веб-сайт ASP.NET MVC. На своем веб-сайте я переписываю URL-адреса в RouteConfig для улучшения SEO. Но у меня проблема с этим. Проблема связана со значением данных маршрута Encoding URL.

Я переписываю URL-адрес в RouteConfig следующим образом:

routes.MapRoute(
               "",
               "places/category/{categoryName}/{category}",
               new { controller = "Item", action = "List", categoryName = "", category = 0 },
               new string[] { "AyarDirectory.Web.Controllers" }
               );

В моем HTML я создал якорную ссылку следующим образом:

<a href="@Url.Content("~/places/category/" + HttpUtility.UrlEncode(category.Name) + "/" + category.Id)">
Content
</a>

Когда я нажимаю на него, если имя не содержит символов, таких как «+», «%» после кодирования, оно всегда показывает 404. Это значение не содержит пробела и/(поэтому нет символов, таких как% и +) после кодирования , работает нормально.

Я ловлю значение в действии, например:

HttpUtility.UrlDecode(value)

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

http://localhost:50489/places/guest house/4

Поэтому, если я использую без значения кодировки, если значение содержит «/», это будет ошибка. Почему это происходит и как я могу закодировать значение данных маршрута URL?


person Wai Yan Hein    schedule 27.05.2016    source источник


Ответы (1)


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

Маршрутизация не только гарантирует, что у вас есть поддерживаемые URL-адреса, но также предоставляет механизм, который будет автоматически кодировать URL-адреса сегментов. Вместо использования Url.Content вам следует использовать Html.ActionLink, Html.RouteLink или Url.Action для создания URL-адресов с использованием MVC.

Html.ActionLink

@Html.ActionLink("Content", "List", "Item", 
    new { categoryName = category.Name, id = category.Id }, null)

Html.RouteLink

Если вам нужно вызвать конкретный маршрут по имени, вы можете использовать Html.RouteLink.

@Html.RouteLink("Content", "TheRoute", new { 
    controller = "Item", 
    action = "List", 
    categoryName = category.Name, 
    id = category.Id })

Но вам нужно дать вашему маршруту имя.

routes.MapRoute(
           "TheRoute",
           "places/category/{categoryName}/{category}",
           new { controller = "Item", action = "List", categoryName = "", category = 0 },
           new string[] { "AyarDirectory.Web.Controllers" }
           );

ПРИМЕЧАНИЕ. Вы также можете использовать RouteLink без указания имени маршрута. В этом случае он работает аналогично ActionLink. Это может быть полезно, если у вас уже есть экземпляр RouteValueDictionary со значениями маршрута и вы просто хотите создать гиперссылку на эти значения маршрута.

URL.Действие

Если вам нужно добавить HTML внутри тега привязки, вы можете использовать Url.Action.

<a href="@Url.Action("List", "Item", new { categoryName = category.Name, id = category.Id })">
    HTML Content Here...
</a>
person NightOwl888    schedule 27.05.2016
comment
Но проблема в том, что мне нужно добавить html-контент между тегами ‹a›‹/a›. Итак, пожалуйста, как я могу этого достичь? - person Wai Yan Hein; 28.05.2016
comment
Большое спасибо. Это действительно полезно для меня. - person Wai Yan Hein; 28.05.2016