He especializado caso de que me desea servir una recta archivo html a partir de una Acción del Controlador.

Quiero servir de otra carpeta distinta de la carpeta Views. El archivo se encuentra en

Solution\Html\index.htm

Y quiero servir de una norma de acción del controlador. Podría yo uso retorno del Archivo? Y
¿cómo puedo hacer esto?

6 Comentarios

  1. 41

    Si quieres hacer esto index.htm archivo en el navegador, a continuación, se podría crear un controlador de acción como esta:

    public void GetHtml()
    {
        var encoding = new System.Text.UTF8Encoding();
        var htm = System.IO.File.ReadAllText(Server.MapPath("/Solution/Html/") + "index.htm", encoding);
        byte[] data = encoding.GetBytes(htm);
        Response.OutputStream.Write(data, 0, data.Length);
        Response.OutputStream.Flush();
    }

    o simplemente por:

    public ActionResult GetHtml()
    {
        return File(Server.MapPath("/Solution/Html/") + "index.htm", "text/html"); 
    }

    Por lo que permite decir que esta acción es en Casa controlador y algunas visitas de usuario http://yoursite.com/Home/GetHtml, a continuación, index.htm será renderizado.

    EDICIÓN: 2 otros métodos

    Si quieres ver raw html de index.htm en el navegador:

    public ActionResult GetHtml()
    {
        Response.AddHeader("Content-Disposition", new System.Net.Mime.ContentDisposition { Inline = true, FileName = "index.htm"}.ToString());
        return File(Server.MapPath("/Solution/Html/") + "index.htm", "text/plain"); 
    }

    Si lo que deseas es descargar el archivo:

    public FilePathResult GetHtml()
    {
        return File(Server.MapPath("/Solution/Html/") + "index.htm", "text/html", "index.htm"); 
    }
    • Server.MapPath no es necesario. sólo trate de return File("~/Html/index.htm", "text/html");
    • Lo de la biblioteca de hacer que usted necesita para utilizar File()?
    • Ok, pero este no carga los archivos referenciados por que «index.htm’ archivo en su directorio, a la derecha?
    • Sí asegurarse de que está a la derecha. Esto es sólo para devolver un archivo html normal
  2. 47

    Mira esto :

        public ActionResult Index()
        {
            return new FilePathResult("~/Html/index.htm", "text/html");
        }
    • return File("~/Html/index.htm", "text/html"); es la respuesta más corta ;D
    • Sí tienes razón 😀
    • cómo codificar el archivo html que estoy viendo algunos símbolos extraños en el archivo html
  3. 8

    Me extendida wahid la respuesta para crear HtmlResult

    Crear Html Resultado que se extiende FilePathResult

    public class HtmlResult : FilePathResult
    {
        public HtmlResult(string path)
            : base(path, "text/html")
        {
        }
    }

    Creado método estático en el controlador de

    public static HtmlResult Html(this Controller controller, string path)
    {
        return new HtmlResult(path);
    }

    utilizado como volvemos la vista

    public HtmlResult Index()
    {
        return this.Html("~/Index.html");
    }

    Espero que ayude

  4. 0

    Se puede leer el archivo html en una cadena y devuelva en acción? Es representado como página Html como se muestra a continuación:

    public string GetHtmlFile(string file)
    {
        file = Server.MapPath("~/" + file);
        StreamReader streamReader = new StreamReader(file);
        string text = streamReader.ReadToEnd();
        streamReader.Close();
        return text;
    }

    Home/GetHtmlFile?file=Solution\Html\index.htm

    Si el destino o el mecanismo de almacenamiento de los archivos HTML es complicado, a continuación, usted puede Ruta de acceso Virtual de proveedor

    Ruta de acceso Virtual de proveedor muestra de MVC

  5. 0

    Quiero poner mi granito de arena en. He encontrado este más conciso y ya hay :

    public ActionResult Index()
    {
         var encoding = new System.Text.UTF8Encoding();
         var html = ""; //get it from file, from blob or whatever
         return this.Content(html, "text/html; charset=utf-8");
    }
  6. 0

    Enfoque alternativo si se utiliza .net core es el uso de un FileProvider.
    Los archivos pueden estar en una carpeta o incrustado en tiempo de compilación.

    En este ejemplo vamos a utilizar archivos incrustados.

    Agregar una carpeta en el proyecto que vamos a decir de los activos, en que se cree un archivo myfile.html añada algo de html básico para el archivo decir

    <html>
    <head>
      <title>Test</title>
    </head>
    <body>
       Hello World
    </body>
    </html>

    Clic derecho en el archivo nuevo (suponiendo que están en visual studio) seleccione propiedades, en las propiedades de pantalla /acción de compilación, seleccione el recurso incrustado. Se agregará el archivo para el archivo csproj.

    Haga clic derecho sobre el proyecto, edite su archivo csproj.
    Compruebe que su grupo de propiedades contiene las siguientes:

    <GenerateEmbeddedFilesManifest>true</GenerateEmbeddedFilesManifest>

    Si no, por favor añádelo. El csproj debe contener también el recién creado archivo html como:

      <ItemGroup>
        <EmbeddedResource Include="assets\myfile.html" />
      </ItemGroup>

    Para leer el archivo en el controlador y se pasa a el cliente requiere un archivo de proveedor que se añade a la de inicio.cs

    Editar su inicio.cs asegúrese de que incluye la HostingEnvironment:

    private readonly IHostingEnvironment HostingEnvironment;
    public Startup(IHostingEnvironment hostingEnvironment)
    {
         HostingEnvironment = hostingEnvironment;
    }

    A continuación, cree un archivo de proveedor y hacer que sea un servicio que puede ser inyectado en tiempo de ejecución. Crear de la siguiente manera:

     var physicalProvider = HostingEnvironment.ContentRootFileProvider;
     var manifestEmbeddedProvider =
          new ManifestEmbeddedFileProvider(Assembly.GetEntryAssembly());
     var compositeProvider =
          new CompositeFileProvider(physicalProvider, manifestEmbeddedProvider);
    
     services.AddSingleton<IFileProvider>(compositeProvider);

    Para servir el archivo de ir a su controlador, el uso de la inyección de dependencia para obtener la FileProvider, crear un nuevo servicio y servir el archivo. Para ello, inicie con la inyección de dependencia mediante la adición de el proveedor a su constructor.

    IFileProvider _fileProvider;
    public MyController(IFileProvider fileProvider)
    {
        this._fileProvider = fileProvider;
    }

    A continuación, utilizar el archivo de proveedor de su servicio de

    [HttpGet("/myfile")]
    [Produces("text/html")]
    public Stream GetMyFile()
    {
       //Use GetFileInfo to get details on the file passing in the path added to the csproj
       //Using the fileInfo returned create a stream and return it.
       IFileInfo fileinfo = _fileProvider.GetFileInfo("assets/myfile.html");
       return fileinfo.CreateReadStream();
    }

    Para más información ver ASP .Net Core proveedor del archivo de ejemplo y la documentación de Microsoft aquí.

Dejar respuesta

Please enter your comment!
Please enter your name here