2011-01-13 27 views
13

Tengo un resultado de acción ExcelResult que devuelve documentos de Microsoft Excel, basados ​​en el Stephen Walther tip. Básicamente solo escribe un flujo a la Respuesta. Al depurar VS 2010 (ASP.NET Dev Server), que funciona muy bien, pero cuando lo ejecuto en una caja de IIS 6, me sale el siguiente error:¿Ejecuta la acción del controlador MVC sin la vista?

The view 'GenerateExcel' or its master was not found. The following locations were searched: ~/Views/Home/GenerateExcel.aspx ~/Views/Home/GenerateExcel.ascx ~/Views/Shared/GenerateExcel.aspx ~/Views/Shared/GenerateExcel.ascx

no hay vista asociada, y por lo tanto no hay ningún archivo , pero no debería ser así. ¿Qué estoy haciendo mal?

ACTUALIZACIÓN

Por la simple devolución vacío en lugar de una ActionResult, ya no tienen este problema. En lugar de devolver ExcelResult, explícitamente lo llamo método ExecuteResult, que está escribiendo en la secuencia de salida.

Antes

public ActionResult GenerateExcel() 
{ 
    return this.Excel(parameters); 
} 

Después

public void GenerateExcel() 
{ 
ExcelResult excelResult = this.Excel(parameters); 
excelResult.ExecuteResult(null); 
} 

Después de eso, tuve problemas de seguridad con mi autenticación NTLM, sino que 'fui' (es decir, espero que vuelvan) Por ahora, sin embargo, todo está funcionando correctamente.

+1

¿No sientes que es un poco difícil decir lo que estás haciendo mal sin mostrar lo que estás haciendo (algún código o algo así)? Desafortunadamente no tengo habilidades telepáticas. –

+0

Bueno, básicamente puedes ver el código en el enlace. Se está devolviendo un ActionResult que es realmente un ExcelResult cuyo método ExecuteResult está escribiendo en la secuencia de salida. – DougJones

Respuesta

13

Asegúrese de que el método de acción no devuelve un ActionResult:

public void DoSomething() 
+3

Oh, no cada acción debería devolver un resultado de acción. En este caso, quiere un 'ExcelResult', que es un resultado de acción personalizado pero sigue siendo un resultado de acción. –

+0

Cada método público en un controlador es un método de acción y puede invocarse mediante una URL adecuada. Mientras escribe una secuencia en Response, puede funcionar. –

+0

¡Eso me llevó a un error diferente! Acabo de ver una página en blanco en lugar del documento Excel adjunto. Vi en Fiddler que ahora recibo un error de acceso denegado 401 sobre la autenticación de Windows NTLM, aunque las otras acciones del controlador (con vistas) se muestran bien. – DougJones

0

Yo no miro el código para el resultado de la acción con mucho detalle, pero debe haber algo mal con el resultado de su acción. ¿Heredaste de algún otro resultado de acción en comparación con la clase ActionResult? ¿Llamaste a base.ExecuteResult? Si es así, eso explicaría por qué está buscando la vista. He creado varias acciones de controlador personalizadas para devolver varios tipos de archivos y nunca buscan una vista.

Estoy de acuerdo con los comentarios sobre la respuesta que dice volver vacío. Eso definitivamente es un truco. No debe llamar a ExecuteResult desde dentro de su acción. Básicamente está escribiendo directamente en la secuencia de respuesta de su acción de controlador. Obviamente funciona, pero realmente no se ajusta al modelo MVC.

3

Esto es bastante útil en un escenario cuando tenemos cientos o miles de visitas. ¿En ese caso crearemos cientos o miles de acciones de controlador? Por supuesto que no, entonces ¿cómo podemos arreglarlo?

En MVC Framework, la clase de controlador incluye un método, HandleUnknownAction(), que se ejecuta cada vez que intentamos invocar una acción (o cuando solicitamos una vista que no tiene un método de acción coincidente) en un controlador que no existe .

enter image description here

creo, esto responde a su pregunta.

Cuestiones relacionadas