2013-08-10 2 views
1

фона

В HomeController.cs у меня есть:Автоматический URL Параметр Encoding В противном случае

[HttpGet] 
public GetPerson(string name) 
{ 
    return View(new PersonModel { ... }); 
} 

В Global.asax.cs у меня есть:

public static void RegisterRoutes(RouteCollection routes) 
{ 
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

    routes.MapRoute(
     "Word", "person/{name}", 
     new { controller = "Home", action = "GetPerson" }); 

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

В SomePage.cshtml у меня есть, по сути, это:

@{ var name = "Winston S. Churchill"; } 
<a href="@Url.Action("GetPerson", "Home", new { name })">@name</a> 

Проблема

Если я нажимаю ссылку для Winston S. Churchill, я направлен на URL http://localhost/person/Winston%20S.%20Churchill, что дает стандартную страницу 404:

Ошибка HTTP 404.0 - Not Found

Ресурс, который вы ищете, удален, изменил его имя или временно недоступен.

Это происходит только если переменная name содержит . (период). Весь мой код работает отлично, когда имя, например, Winston Churchill.

Как сделать ASP.NET MVC 3-процентным кодированием . (период) в URL-адресе?

Или, как я могу сделать работу по маршрутизации без . (период) в процентах?

Неприемлемо Обход (если представлены без обоснования)

Если изменить маршрут к следующему, все работает.

routes.MapRoute(
    "Word", "person", 
    new { controller = "Home", action = "GetPerson" }); 

Однако URL становится http://localhost/person?name=Winston%20S.%20Churchill, который не то, что я хочу. Я хочу, чтобы name в части пути URL, а не в запросе.

ответ

4

Маршруты, содержащие период и неизвестное расширение, интерпретируются IIS как статические файлы и не отправляются через конвейер .NET. Например, URL, который вы цитируете, интерпретируется как статический файл с расширением %20Churchill.

Вы можете заставить ASP.NET обрабатывать все запросы, добавив в web.config:

<system.webServer> 
    <modules runAllManagedModulesForAllRequests="true" /> 
</system.webServer> 

Вам также нужно, чтобы обрабатывать name значения, которые заканчиваются с периодом (в отличие от всего, содержащих один):

<system.web> 
    <httpRuntime relaxedUrlToFileSystemMapping="true" /> 
</system.web> 

Все /person/{name} URL, затем будет подобран код ASP.NET.

Если вы предпочитаете не использовать этот параметр, самый простой обходной путь будет использовать собственную кодировку:

name.Replace(".","--") 
+0

Существуют ли какие-либо проблемы безопасности с этим, что может быть неожиданным? –

+1

Кроме того, хотя это работает для «Уинстона С. Черчилля» (я просто попробовал), он терпит неудачу для «Альберта Гора младшего» (период примечания в конце). –

+1

Нет проблем с безопасностью, но это означает, что ASP.NET будет пытаться обрабатывать все запросы, поэтому файлы, которые на самом деле являются статическими (изображения, CSS и т. Д.), Будут занимать чуть больше времени для загрузки. На практике вы вряд ли заметите разницу. Чтобы исправить проблему с завершающим периодом, попробуйте добавить '' to ''. – James

Смежные вопросы