2011-06-23 77 views
8

Tengo una acción de controlador que descarga un archivo de un blob azul basado en el nombre de referencia del contenedor (es decir, nombre de ruta completo del archivo en el blob). El código es como la siguiente:Manejo de FileContentResult cuando no se encuentra el archivo

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"); 
} 

La clase BlobStorage no es mi clase de ayuda para descargar la corriente de la burbuja.

Mi pregunta se expresa en el comentario del código: ¿Cómo debo manejar el escenario cuando no se encuentra el archivo/secuencia? Actualmente, estoy pasando un archivo PDF vacío, que creo que no es la mejor manera de hacerlo.

+0

@Stecya: Esto se llama desde el ver a través de javascript. –

+0

¿Cuál debería ser el tipo de datos en la llamada ajax? @Alex R podría mostrar también cómo se hace la llamada ajax en la vista, sería útil. – michael

+0

La pregunta ya está respondida. ¿También estás teniendo el mismo problema? La llamada desde el javascript es simplemente 'window.location.href =" GetDocument? PathName = "+ docPath;'. Eso llamará a la acción del controlador anterior y responderá en consecuencia. –

Respuesta

15

La forma correcta de manejar una que no se encuentra en una aplicación web es mediante la devolución de un código de estado HTTP 404 al cliente que en términos ASP.NET MVC se traduce en devolver un HttpNotFoundResult de su acción del controlador:

return new HttpNotFoundResult(); 

Ahh, oops, no se dio cuenta que todavía estabas en ASP.NET MVC 2. se puede aplicar por sí mismo, porque HttpNotFoundResult se introdujo sólo en 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

En caso de MVC3, ¿se hereda 'HttpNotFoundResult' de' ActionResult'? En este caso, la definición del método de acción debe ser 'public ActionResult GetDocument (String pathName)', ¿Correcto? –

+1

@LordCover, a la derecha. Te recomendaría usar siempre 'ActionResult' como tipo de devolución en tus firmas de acción. También actualicé mi respuesta para proporcionar una implementación de muestra de 'HttpNotFoundResult'. –

+0

Bueno, gracias, generalmente uso el nivel más alto en casos como este, pero si tengo uno y solo un valor definido como 'JsonResult', lo uso solo. Sí, lo noté y +1. –

Cuestiones relacionadas