2015-07-01 8 views
8

Per prima cosa devo spiegare il mio problema, ho un'applicazione di query nativa in cui qualcuno digita "Seleziona .... questo e quello" e l'output è attualmente visualizzato in una griglia che è impaginato e mi è stato chiesto di aggiungere un pulsante che esporterà i dati per eccellere direttamente da un flusso di dati non tipizzato. il mio codice corrente che ho trovato utilizza una griglia e continua a non chiedermi di scaricare un file .xls per qualche motivo.Desidero inviare l'output di query nativo in formato libero per eccellere utilizzando una griglia Web

 [Authorize(Roles = "Portal administrator")] 
    public void ExportExcel(NativeQueryVM model, int? page, string sort) 
    { 
     List<Dictionary<string, object>> result = null; 
     String vartimedate = DateTime.Now.ToString("yyyy-dd-M--HH-mm-ss"); 
     try 
     { 
      var user = Membership.GetUser(); 
      var grid = new System.Web.UI.WebControls.GridView(); 
      if (page == null && sort == null) 
      { 
       if (model.QueryText.ToUpper().StartsWith("SELECT")) 
       { 
        UserQueryInput queryinput = new UserQueryInput(); 
        queryinput.DatabaseId = model.selectedDatabase; 
        queryinput.QueryText = model.QueryText; 
        result = lookupProvider.GetSetNativeQuery((Guid)user.ProviderUserKey, user.UserName, queryinput, "Set"); 
        model.QueryResultData = result; 
        ViewBag.SubmitType = "Select"; 
        CreateDynamicResult(model.QueryResultData); 
        if (model == null || model.QueryResultData.Count == 0) 
        { 
         ViewBag.ResultMessage = "No Results Found"; 
        } 
        else 
        { 

         WebGrid wd = new WebGrid(source: ViewBag.DynamicResult, canPage: false, canSort: false); 

         string griddata = wd.GetHtml().ToString(); 
         string attachment = "attachment; filename=NativeQuery" + vartimedate + ".xls"; 
         Response.ClearContent(); 
         Response.AddHeader("content-disposition", attachment); 
         Response.ContentType = "application/excel"; 
         StringWriter sw = new StringWriter(); 
         HtmlTextWriter htw = new HtmlTextWriter(sw); 
         Response.Write(griddata); 
         Response.End(); 
        } 
       } 

      } 
      else 
      { //This part should come when page or sort is not null for Select. Should not be executed other than SELECT 
       result = lookupProvider.GetSetNativeQuery((Guid)user.ProviderUserKey, user.UserName, null, "Get"); 
       model.QueryResultData = result; 
       ViewBag.SubmitType = "Select"; 
       CreateDynamicResult(model.QueryResultData); 
       if (model == null || model.QueryResultData.Count == 0) 
       { 
        ViewBag.ResultMessage = "No Results Found"; 
       } 
       else 
       { 

       } 
      } 

     } 
     catch (Exception ex) 
     { 
      logger.Log(new LogMessage() 
      .ForMethod("SubmitQuery") 
      .WithContext(Environment.MachineName) 
      .WithException(ex) 
      .WithDescription("An error occurred while submiting query to get result")); 
     } 
    } 
+0

Nel codice provare un Response.Output.Write (gridData) dove si ha Response.Write (gridData). –

risposta

0

Ciao a tutti che ha risposto a questo problema, e ho trovato la risposta e le questioni risiedono al di fuori della codice che ho inserito nella domanda. Jquery intercettava l'output del mio flusso di file e d'altra parte, se il pulsante è stato creato con runat = server, il modello è fuori portata e la parte principale della soluzione implicava il salvataggio del modello in una sessione e il suo rientro.

Grazie per il vostro aiuto tutto ...

-1

Come si chiama questa funzione di vuoto? I percorsi di ritorno includono l'impostazione di una proprietà ViewBag con un messaggio di errore insieme alla modifica della risposta. Puzza di cattivo design.

Vorrei creare un collegamento ipertestuale che collega a un @Url.Action per qualcosa di simile. Si noti che avresti bisogno di restituire un FileContentResult con i dati UTF8 codifica piuttosto che modificare il Response direttamente:

public async Task<ActionResult> Test() 
     {     
      WebGrid wd = new WebGrid(source: ViewBag.DynamicResult, canPage: false, canSort: false); 

        string griddata = wd.GetHtml().ToString(); 
        string attachment = "attachment; filename=NativeQuery" + vartimedate + ".xls"; 
        Response.ClearContent(); 
        Response.AddHeader("content-disposition", attachment); 
        Response.ContentType = "application/excel"; 
      byte[] buffer = System.Text.UTF8Encoding.UTF8.GetBytes(griddata); 

      return File(buffer, "application/octet-stream"); 
     } 
Problemi correlati