2011-06-23 14 views
8

Mam działanie kontrolera, które pobiera plik z obiektu typu blob, na podstawie nazwy odniesienia kontenera (tj. Pełnej nazwy ścieżki pliku w obszarze blob). Kod wygląda mniej więcej tak:Obsługa pliku FileContentResult, gdy plik nie zostanie znaleziony

public FileContentResult GetDocument(String pathName) 
{ 
    try 
    { 
     Byte[] buffer = BlobStorage.DownloadFile(pathName); 
     FileContentResult result = new FileContentResult(buffer, "PDF"); 
     String[] folders = pathName.Split(new char[] { '\\' }, StringSplitOptions.RemoveEmptyEntries); 
     // get the last one as actual "file name" based on some convention 
     result.FileDownloadName = folders[folders.Length - 1]; 

     return result; 
    } 
    catch (Exception ex) 
    { 
     // log error 
    } 
    // how to handle if file is not found? 
    return new FileContentResult(new byte[] { }, "PDF"); 
} 

Klasa BlobStorage jest moja klasa pomocnika pobrać strumień z blob.

Moje pytanie jest zawarte w komentarzu do kodu: Jak mam obsługiwać scenariusz, gdy plik/strumień nie zostanie znaleziony? Obecnie przekazuję pusty plik PDF, który moim zdaniem nie jest najlepszym sposobem na zrobienie tego.

+0

@Stecya: nazywa się to z zobacz przez javascript. –

+0

Jaki powinien być typ danych w wywołaniu ajax? @Alex R można również pokazać, jak wywołanie ajax jest w widoku byłoby pomocne. – michael

+0

Na to pytanie już udzielono odpowiedzi. Czy masz również ten sam problem? Wywołanie z javascript jest po prostu 'window.location.href =" GetDocument? PathName = "+ docPath;'. To wywoła działanie kontrolera powyżej i odpowiednio zareaguje. –

Odpowiedz

15

Poprawny sposób obsłużyć Nie znaleziono w aplikacji internetowej jest poprzez zwrot 404 kod stanu HTTP do klienta, który pod względem ASP.NET MVC przekłada się na powrocie do HttpNotFoundResult z działania kontrolera:

return new HttpNotFoundResult(); 

Ahh, oops, nie zauważył, że wciąż na ASP.NET MVC 2. można go realizować siebie bo HttpNotFoundResult został wprowadzony dopiero w ASP.NET MVC 3:

public class HttpNotFoundResult : ActionResult 
{ 
    public override void ExecuteResult(ControllerContext context) 
    { 
     if (context == null) 
     { 
      throw new ArgumentNullException("context"); 
     } 
     context.HttpContext.Response.StatusCode = 404; 
    } 
} 
+1

W przypadku MVC3, jest 'HttpNotFoundResult' odziedziczony z' ActionResult'? W tym przypadku definicja metody działania powinna być "public ActionResult GetDocument (String pathName)", prawda? –

+1

@ Lord Cover, w prawo. Polecam, abyś zawsze używał 'ActionResult' jako typu zwracanego w twoich sygnaturach akcji. Zaktualizowałem również moją odpowiedź, aby dostarczyć przykładową implementację 'HttpNotFoundResult'. –

+0

Cóż, dziękuję, zazwyczaj używam wyższego poziomu w takich przypadkach, jak to pytanie, ale jeśli mam jedną i tylko jedną określoną wartość, jak "JsonResult", używam go sam. Tak, zauważyłem to i +1. –

Powiązane problemy