2011-07-18 23 views
6

ASP.NET MVC3/Razor.Kodowanie adresu URL MVC3?

Okazało się, że podczas tworzenia łącza działania, mówią tak:

silnik
@Html.ActionLink(product.Title, "Detail", "Products", new { id = product.ProductID }, null) 

MVC3 tworzy moje informacje o produkcie. Na przykład:

http://myhost/{ActionUrl}/PRODID 

Jeśli jednak mój identyfikator produktu miałby zawierać dowolny znak specjalny, nie zostałby zakodowany przy użyciu adresu URL.

http://myhost/{ActionUrl}/PROD/ID 

Oczywiście, łamie to mój routing. Moje pytania są następujące:

  1. Czy powinienem oczekiwać automatycznego adresu kodowania? Czy jest jakiś sposób, aby to ustawić?
  2. Jeśli nie, to jaki jest najczyściejszy sposób kodowania i dekodowania? Naprawdę nie chcę tego robić w każdym kontrolerze.

Dzięki!

Odpowiedz

4

Jeśli identyfikator zawiera znaki specjalne, polecam przekazanie go jako ciąg zapytania, a nie jako część ścieżki. Jeśli nie będziesz przygotowany na wyboistą drogę. Zamówienie na following blog post.

+0

Zajęło mi trochę czasu, aby uświadomić sobie, ale masz całkowitą rację w swojej odpowiedzi. Niektóre znaki są jak zastrzeżone słowa kluczowe i po prostu nie możesz nic z tym zrobić. W przypadku niektórych innych możesz robić dziwne rzeczy, a nawet korzystać z tras catch-all, ale niektóre ze znaków specjalnych będą musiały pozostać w ten sposób (chyba, że ​​chcesz przepisać je za pomocą wyrażeń regularnych). – Alpha

+1

Więc jaki jest kod, aby zrobić to jako kwerenda? –

1

nie dostać to do pracy na drodze, ale do tej pracy jako parametr kwerendy jako @Darin wskazał oto kod:

@Html.ActionLink(product.Title, "Detail", "Products", new { id = product.ProductID }, "") 

stworzył actionlink jako kwerendy dla mnie tak: Products/Detail?id=PRODUCTID

moja droga w Global.asax.cs wyglądał następująco:

routes.MapRoute(
     "ProductDetail", 
     "Products/Detail", 
     new { controller = "Products", action = "Detail" } 
     ); 

w moim ProductController:

public ActionResult Detail(string id) 
{ 
    string identifier = HttpUtility.HtmlDecode(id); 
    Store.GetDetails(identifier); 
    return RedirectToAction("Index", "Home"); 
} 
+0

Co stanie się, gdy "PRODUCTID" zawiera "/" lub "#"? Co otrzymuje kontroler? – Alpha

+0

kontroler odbiera/zakodowany jako% 2f. HttpUtility.HtmlDecode przekształci go z powrotem w ukośnik. Nie mam konfiguracji kodu, aby przetestować #, ale spodziewam się, że kontroler otrzyma% 23 –

+0

Dzięki, to ma sens. Zobaczyłem, że również przeniosłeś go do łańcucha zapytania, ale pracuję z nim w sekcji ścieżki. Nawet podczas kodowania przerwie tworzenie ścieżki. Szukałem sposobu radzenia sobie z tym na ścieżce. Dzięki! – Alpha