c# 4.0 - tarjeta - Deseo enviar salida de consulta nativa de forma gratuita a Excel utilizando un WebGrid
tarjeta mastercard banco nacion (2)
Primero necesito explicar mi problema, tengo una aplicación de consulta nativa donde alguien escribe "Seleccione ... esto y aquello" y la salida se muestra actualmente en una cuadrícula que está paginada y se me ha pedido que agregue un botón que exportará los datos a Excel directamente desde un flujo de datos sin tipo. mi código actual que he encontrado usa una grilla y todavía no me indica que descargue un archivo .xls por alguna razón.
[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"));
}
}
¿Cómo llamas a esta función vacía? Las rutas de retorno incluyen establecer una propiedad ViewBag
con un mensaje de error junto con la modificación de la respuesta. Huele a mal diseño.
@Url.Action
un hipervínculo que enlaza con una @Url.Action
para algo como esto. Tenga en cuenta que deberá devolver un FileContentResult
con los datos codificados en UTF8 en lugar de modificar la Response
directamente:
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");
}
Hola, todos respondieron a este problema, y encontré la respuesta y los problemas residen fuera del código que ingresé en la pregunta. Jquery estaba interceptando la salida de mi secuencia de archivos y, por otro lado, si el botón se creó con runat = server, el modelo está fuera de alcance y la parte principal de la solución consistía en guardar el modelo en una sesión y volver a colocarlo.
Gracias por su ayuda, todo ...