Solución:
Iniciaría una solicitud $ .get a otra acción del controlador que verificaría el recuento de pedidos. Devuelve ese valor, junto con un mensaje de error si corresponde. Muestre el mensaje de error cuando sea necesario; de lo contrario, procese su redirección para descargar su archivo. Es una llamada adicional al controlador, pero le permite tener un control total y manejar la posibilidad de un error sin redirigir a su usuario.
$("#exportPPT").live('click', function (e) {
$.get( "/Initiative/CheckForOrders" + GenerateParams(), function( data ) {
if (data.IsValid) {
window.location.href = "https://foroayuda.es/Initiative/GenerateFile" + GenerateParams();
} else {
alert(data.ErrorMessage); // or show a div containing error message
}
});
});
Acción del controlador:
public ActionResult CheckForOrders(MyParams myParams)
{
IEnumerable<Order> orders = Model.GetOrders(myparams);
if (orders.Any())
return Json(new { IsValid=true }, JsonRequestBehavior.AllowGet);
return Json(new { IsValid=false, ErrorMessage="No orders" }, JsonRequestBehavior.AllowGet);
}
¿Devolvería un estado que representa que un recurso no existe y devolvería nulo? Luego, puede manejarlo en consecuencia en su javascript sin preocuparse por hacer múltiples llamadas ajax para verificar que una esté disponible o las implicaciones de seguridad si alguien pasa por alto dichos controles.
Por ejemplo…
Controlador
public ActionResult GenerateFile(MyParams myParams)
{
var template = Server.MapPath(PPT_ROOT + "/template.pptx");
IEnumerable<Order> orders = Model.GetOrders(myparams);
if(!orders.Any()){
Response.StatusCode = (int)HttpStatusCode.NotFound
Response.StatusDescription = HttpStatusCode.NotFound.ToString();
Response.TrySkipIisCustomErrors = true;
return EmptyResult;
}
var pptResults = GeneratePowerpointFile(orders);
return new File(pptResults.Content, "application/vnd.ms-powerpoint", pptResults.FileName);
}