2009-08-08 11 views
6

Oto, co chciałbym zrobić. Mam treść, którą piszę do widoku. Ta treść ma odniesienia do obrazu, które są względne w stosunku do dokumentu. Tak na przykład, jeśli szukam pod następującym adresem URL:Obsługa obrazów z tej samej ścieżki routowanego adresu URL w ASP.NET MVC

http://localhost/article/8AB98/ 

Zawartość może mieć obraz w następującej formie:

<img src="myimage.png" /> 

To oczywiście spowoduje, że przeglądarka zapytać o obrazie pod następującym adresem URL:

http://localhost/article/8AB98/myimage.png 

Jednak z powodu trasy mvc obraz ten nie zostanie znaleziony. Czy znasz prosty sposób, w jaki mogę spowodować, aby adres URL zwrócił prawidłowy obraz do przeglądarki?

uwaga: to rzeczywiście ważne, że znaczniki pozostają nietknięte od oryginału ... oznacza to, że w jakiś sposób ponownego pisania adresów URL obrazka tak wskazują one do innego folderu poza URL bieżącego widoku jest niestety nie wchodzi w grę .

Dzięki!

Odpowiedz

5

jestem przy założeniu, że kiedy mówisz „to rzeczywiście ważne, że znaczniki pozostają nietknięte od oryginału” to znaczy, że

<img src="myimage.png" /> 

jest to, co musi być renderowane do przeglądarki, a więc trzeba oszukać serwer wWW do podjęcia żądania URL

http://localhost/article/8AB98/myimage.png 

i używać tylko tych informacji, aby znaleźć odpowiednie zdjęcie, gdziekolwiek się ono przechowywane, i odesłać go do przeglądarki.

Dwie opcje przychodzą na myśl, ale trudno powiedzieć, które z nich można polecić, ponieważ nie powiedzieliśmy, gdzie przechowywane są obrazy.

Wariant 1 - URL Rewriter

kupić kopię ISAPI_Rewrite i wszystkie adresy URL, które spełniają powyższe kryteria przepisane tak, aby uzyskać obraz iść tam, gdzie mieszka. Więcej informacji na temat ISAPI_Rewrite here.

Wariant 2 - Niestandardowe HttpHandler

Można napisać HttpHandler odwzorowaną na wszystkie pliki PNG żądań plików, które przetwarza żądania URL i robi to, co musi zrobić, aby znaleźć obraz, a następnie odesłać go do strumienia odpowiedzi . Wadą tego jest to, że musisz poinformować IIS, aby zmapował wszystkie żądania PNG, aby przejść przez aspnet_isapi.dll, co może być błędem wydajności.

Nadal nie jestem pewien, czy rozumiem Twój problem poprawnie, ale mam nadzieję, że to pomaga. Powodzenia.

+0

Nie użyłem dokładnie tych dwóch opcji, ale ostatecznie to rozwiązanie to rozwiązało :-) I ' Napisz kolejną odpowiedź na pytanie ze szczegółami –

1

Jednym ze sposobów, aby to zrobić byłoby umieścić w IgnoreRoute dla plików graficznych:

public static void RegisterRoutes(RouteCollection routes) 
{ 
    routes.IgnoreRoute("article/{ArticleID}/{name}.png"); 
    ... 
6

Można użyć Url.Content metoda().

<img src="<%= Url.Content("~/images/myimage.png") %>" /> 

To rozwiąże adres URL z katalogu głównego aplikacji.

+1

Kusiłbym też, by napisać pomocnika, żebyś mógł mieć Html.Image ("~/images/myimage. png "," myAltText "); A twoja metoda pomocnika mogłaby zwrócić w zasadzie to, co ma kod Phila. –

+0

Witaj, Phil ... zmiana adresu URL z "myimage.png", na to, co zwróci plik url.content, nie jest możliwa, ponieważ znaczniki zawartości nie są moimi zmianami. Poza tym, faktycznie potrzebuję tego znacznika () do wyświetlenia w przeglądarce (jak wspomniałem @thinkzig) –

-1

Skończyło się na rozwiązaniu @ thinkzig, choć w nieco inny sposób. Korzystając z FileContent z zestawu MVC Futures, dodałem kolejną trasę do obsługi obrazów.

routes.MapRoute("Image", "article/{id}/{image}", new { controller = "Article", action = "Image" }); 
routes.MapRoute("Article", "article/{id}", new { controller = "Article", action = "Index" }); 

Ta nowa metoda działania po prostu konstruuje filepath na podstawie nazwy articleID i obrazu:

public ActionResult Image(string id, string image) 
{ 
    string articlePath = Server.MapPath("~/views/article/"); 
    string filePath = Path.Combine(articlePath, string.Format("{0}/{1}", id, image)); 
    return this.File(filePath, "image"); 
} 

Był jeden inny drobiazg miałem do czynienia z. Jeśli użytkownik uzyskuje dostęp do artykułu bez ukośnego ukośnika (http://localhost/article/8AB98), to przeglądarka uważa, że ​​articleID jest plikiem i próbuje znaleźć niewłaściwy folder obrazu (http://localhost/article/img.png).

Na szczęście w takim przypadku mvc kieruje żądanie do akcji artykułu z nazwą obrazu jako "id", więc mogę po prostu poszukać "." w id, a następnie użyj zwykłej akcji Image, aby ją przetworzyć.

w akcji artykułu:

if (id.Contains(".")) 
{ 
    return RedirectToImage(id); 
} 

a nastepnie numer redirecttoimage który domyśla się identyfikator pliku i nazwę

private ActionResult RedirectToImage(string id) 
{ 
    if (Request.UrlReferrer == null) 
    { 
     return Content("invalid request"); 
    } 

    var referrer = Request.UrlReferrer.ToString(); 
    if (referrer.Contains("?")) 
    { 
     referrer = referrer.Split('?')[0]; 
    } 

    var realId = Path.GetFileName(referrer); 
    return this.Image(realId, id); 
} 

Będziesz pamiętać, że mogę liczyć na URL odsyłający do uzyskaj aktualny identyfikator artykułu. Jeśli użytkownik spróbuje kliknąć prawym przyciskiem myszy na obrazie (gdy obejrzysz go bez końcowego ukośnika) i wybierze "Otwórz obraz w nowej karcie", to nie mam możliwości sprawdzenia, jaki jest identyfikator artykułu, dlatego właśnie zwracam "nieprawidłowe żądanie" ciąg do użytkownika. To dobrze, ponieważ tak naprawdę nie staram się wspierać tych użytkowników w tej sytuacji :-)

Powiązane problemy