2016-11-15 68 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); 
    } 
}