2011-09-08 15 views
7

Kullanıcının indirmesi için bir Excel raporu oluşturduğundan bir boşluk döndüren bir denetleyici yöntemim var. Kullandığımız Excel 3. parti kütüphanesi, yanıtın kendisine yazıyor. yöntem şöyle görünür:MVC3'te bir VOID yönteminden başka bir Eylem/Denetleyiciye Nasıl Yönlendiririm?

kullanıcı raporunu alma için belli kimlik uymuyorsa istisnalar atmak yerine birkaç güvenlik kontrolleri vardır
[HttpGet] 
public void GetExcel(int id) 
{ 
    try 
    { 
    var report = _reportService.GetReport(id); 
    var table = _reportService.GetReportTable(id); 
    var excelReport = new ExcelReport(table, report.Name); 
    excelReport.DownloadReport(System.Web.HttpContext.Current.Response); 
    } 
    catch (Exception ex) 
    { 
    // This is wrong, of course, because I'm not returning an ActionResult 
    Response.RedirectToRoute("/Report/Error/", new { exceptionType = ex.GetType().Name }); 
    } 
} 

. Farklı bir sayfaya yönlendirmek ve istisna hakkında bazı bilgileri iletmek istiyorum, ancak MVC3'te bunu nasıl yapacağımı anlayamıyorum ....

Herhangi bir fikir var mı?

cevap

2

yerine yanıta 3 parça kütüphanesi yazma vermektense doğrudan içerik düzenli ActionResult kullanabilir ve gerçek dosya veya hata RedirectToAction(...) (veya RedirectToRoute(...)) için File(...) dönmek olsun. Eğer 3. parti kütüphaneniz sadece Cevabı yazabiliyorsa, çıktısını almak için bazı hileler kullanmanız gerekebilir.

[HttpGet] 
public ActionResult GetExcel(int id) 
{ 
    try 
    { 
    var report = _reportService.GetReport(id); 
    var table = _reportService.GetReportTable(id); 
    var excelReport = new ExcelReport(table, report.Name); 
    var content = excelReport.MakeReport(System.Web.HttpContext.Current.Response); 
    return File(content, "application/xls", "something.xls"); 
    } 
    catch (Exception ex) 
    { 
    RedirectToRoute("/Report/Error/", new { exceptionType = ex.GetType().Name }); 
    } 
} 
8

Bir

Response.Redirect(Url.Action("Error", "Report", new { exceptionType = ex.GetType().Name }); 

yapabileceğini Ama FilePathResult veya FileStreamResult bir göz almış?

[HttpGet] 
public ActionResult GetExcel(int id) 
{ 
     try 
     { 
     var report = _reportService.GetReport(id); 
     var table = _reportService.GetReportTable(id); 
     var excelReport = new ExcelReport(table, report.Name); 
     excelReport.DownloadReport(System.Web.HttpContext.Current.Response); 

     return new EmptyResult(); 
     } 
     catch (Exception ex) 
     { 
     return RedirectToAction("Error", "Report", rnew { exceptionType = ex.GetType().Name });  
     } 

} 

çalıştığını emin değilim, aCoolFunction:

+0

Teşekkür önemli. Benim için çalıştı. – Mohan

0

diğer yaklaşım bir istisna filtre kullanarak olacaktır:

public class MyExceptionFilter : FilterAttribute, IExceptionFilter 
{ 
    public void OnException(ExceptionContext filterContext) 
    { 
     var routeValues = new RouteValueDictionary() 
     { 
      { "controller", "Error" }, 
      { "action", "Report" } 
     }; 

     filterContext.Result = new RedirectToRouteResult(routeValues); 
     filterContext.ExceptionHandled = true; 

     // Or I can skip the redirection and render a whole new view 

     //filterContext.Result = new ViewResult() 
     //{ 
     // ViewName = "Error" 
     // //.. 
     //}; 
    } 
} 
İlgili konular