es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Archivo de descarga de Blazor Server con parámetros

Tengo una aplicación Blazor Server donde los usuarios pueden usar filtros para ver una lista de películas. Por ejemplo, pueden especificar el año, el país, etc. y las películas que cumplan con los criterios se mostrarán en la página (una lista de objetos Movie).

Quiero dar a los usuarios la capacidad de guardar la lista mostrada como un archivo de texto. Sé cómo hacer una solicitud HTTP Get a otra página Razor o un controlador MVC o API para devolver un archivo predefinido, pero tengo problemas para pasar cualquier argumento al punto final.

Inicialmente, pensé en usar HttpClient.PostAsJsonAsync para enviar una solicitud POST a un controlador API, pasando la lista como cuerpo de la solicitud, lo que funciona bien en el sentido de que si pongo un punto de interrupción en el método del controlador, se activa pero no se devuelve nada al usuario.

Si uso un elemento o un método onClick de un botón con NavigationManager.NavigateTo, funciona bien para una solicitud HTTP Get de archivo predefinida, pero ¿cómo puedo servir a los usuarios con un archivo que consista en la lista de películas/objetos que están viendo en el navegador?

Es decir, ¿cómo puedo pasar argumentos con NavigationManager.NavigateTo o usando un elemento o cualquier otra manera para enviar datos al punto final/servidor que luego pueda usar para generar un archivo y devolver ese archivo al usuario para su guardado?

Código de ejemplo para dar una idea de lo que me gustaría. Esto es solo una referencia de diseño/idea, no tiene que ser WebApi, MVC o cualquier otra cosa. Solo necesito algo que funcione con Blazor:

[HttpPost]
File WebApiMethodThatDoesTheWork(CustomObject data)
{
StringBuilder stringBuilder = new();
foreach (var item in data.Items)
{
stringBuilder.Append(item);
}

File.WriteAllText("test.txt", stringBuilder.ToString());
return File("test.txt");

}

Las únicas dos requisitos que tengo sobre cómo se descargará el archivo son: debe ser amigable para el usuario, lo que significa que el cuadro de diálogo habitual “¿Desea abrir o guardar este archivo?” sería perfecto y no debe usar la solicitud GET a una página Razor para recuperar el archivo A MENOS QUE se pueda utilizar una sola página Razor para descargar muchos tipos de archivos diferentes. Es decir, si un usuario quiere descargar una lista de películas, mientras que otro quiere una lista de canciones. Con mi conocimiento actual, creo que para un caso así tendría que tener 2 páginas Razor diferentes, lo que no es óptimo.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Puede utilizar el método NavigationManager.NavigateTo para enviar datos al punto final/servidor, el cual puede utilizarlos para generar un archivo y devolver ese archivo al usuario para guardarlo. Puede pasar argumentos al punto final/servidor agregándolos a la URL como parámetros de cadena de consulta. Por ejemplo, si desea pasar una lista de películas al punto final/servidor, puede hacer algo como esto:

    NavigationManager.NavigateTo($"/api/download?movies={JsonConvert.SerializeObject(movies)}");
    

    En el lado del servidor, puede utilizar el método JsonConvert.DeserializeObject para deserializar la lista de películas del parámetro de cadena de consulta. Luego puede usar el método File para devolver el archivo al usuario para guardarlo.

    “`
    [HttpGet]
    public File Download(string movies)
    {
    var movieList = JsonConvert.DeserializeObject<>>(movies);
    StringBuilder stringBuilder = new();
    foreach (var item in movieList)
    {
    stringBuilder.Append(item);
    }

    File.WriteAllText("test.txt", stringBuilder.ToString());
    return File("test.txt");
    

    }
    “`

Comments are closed.