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 :-)
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 –