2016-11-15 73 views
0

我是asp.net-mvc的新手,现在我正在处理返回excel文件和错误消息,如果返回的文件列丢失,当用户单击按钮。我使用​​来返回我的文件来查看,但我不知道如何将错误消息一起发送。 (我曾尝试ViewBag,但它没有工作)如何发送文件以查看与错误消息一起?如何返回文件以及错误消息以查看?

回答

0

我会建议返回文件作为模型,并增加了ModelState任何错误在你的控制器是这样的:

ModelState.AddModelError("Key", "Error Message"); 

如果你想在ModelState解析成JSON在JavaScript中使用,你可以使用这个方法:

public static string ParseModelState(ModelStateDictionary modelState) 
{ 
    if (modelState == null) return ""; 
    var dic = new Dictionary<string, string>(); 
    for (var i = 0; i < modelState.Keys.Count; i++) 
    { 
     var firstOrDefault = modelState.Values.ElementAt(i).Errors.FirstOrDefault(); 
     if (firstOrDefault != null) 
      dic.Add(modelState.Keys.ElementAt(i), firstOrDefault.ErrorMessage); 
    } 
    return System.Web.Helpers.Json.Encode(dic); 
} 

而在你的视野:

var modelState = @Html.Raw(Helpers.ParseModelState(ViewData.ModelState)); 
0

是您在服务器上的文件存储?如果是的话,你可以在URL作为JSON的面值和在JavaScript返回文件,你可以在新窗口中显示错误和负载的文件

return return Json(new {error="Error Message", fileurl="http://yoursite.com/file.etx"}); 

在客户端(我猜你张贴信息)

$.ajax({ 
     type: "POST", 
     url: '@Url.Action("Action", "Control")', 
     data: { para: "value" }, 
     dataType: "json", 
     success: function(data) { 
      $('#errorlabel').html(data.error); 
      window.open(data.fileurl,_blank); 
    }, 
     error: errorFunc 
    }); 

希望这给你一个好主意,开始

1

我想你可以尝试使用Ajax的生成excel文件到临时文件夹中的服务器,并通过Ajax响应下载,代码如下:

$.blockUI({ message: '<h3><img src="@Url.Content("~/Content/images/busy.gif")" /> Please wait a moment...</h3>' });  
$.ajax({ 
     type: "POST", 
     url: '@Url.Action("ExportExcel","YourController")', 
     contentType: "application/json; charset=utf-8", 
     dataType: "json", 
    }).done(function (data) { 
     //console.log(data.result); 
     $.unblockUI(); 
     if (data.fileName != "") { 
      window.location.href = "@Url.RouteUrl(new { Controller = "YourController", Action = "Download"})/?file=" + data.fileName; 
     } 
    }); 
控制器

[HttpPost] 
public JsonResult ExportExcel() 
{ 
    DataTable dt = DataService.GetData(); 
    var fileName = "Excel_" + DateTime.Now.ToString("yyyyMMddHHmm") + ".xls"; 
    string fullPath = Path.Combine(Server.MapPath("~/temp"), fileName); 

    using (var exportData = new MemoryStream()) 
    { 
     Utility.WriteDataTableToExcel(dt, ".xls", exportData); 

     FileStream file = new FileStream(fullPath, FileMode.Create, FileAccess.Write); 
     exportData.WriteTo(file); 
     file.Close(); 
    } 

    var errorMessage = "you can return the errors in here!"; 

    return Json(new { fileName = fileName, errorMessage = "" }); 
} 

和下载操作

[HttpGet] 
[DeleteFileAttribute] 
public virtual ActionResult Download(string file) 
{ 
    string fullPath = Path.Combine(Server.MapPath("~/temp"), file); 
    return File(fullPath, "application/vnd.ms-excel", file); 
} 

在这里,我创建了自动删除过滤器删除该文件下载后:

/// <summary> 
/// The Action filter for delete the file after downloaded 
/// </summary> 
public class DeleteFileAttribute : ActionFilterAttribute 
{ 
    public override void OnResultExecuted(ResultExecutedContext filterContext) 
    { 
     filterContext.HttpContext.Response.Flush(); 
     string filePath = (filterContext.Result as FilePathResult).FileName; 
     System.IO.File.Delete(filePath); 
    } 
}