web-dev-qa-db-de.com

So stellen Sie die HTML-Datei aus einem anderen Verzeichnis als ActionResult bereit

Ich habe einen Spezialfall, in dem ich eine direkte HTML-Datei aus einer Controller-Aktion liefern möchte.

Ich möchte es aus einem anderen Ordner als dem Views-Ordner bereitstellen. Die Datei befindet sich in

Solution\Html\index.htm

Und ich möchte es mit einer Standard-Controller-Aktion bedienen. Könnte ich zurück Datei verwenden? Und wie mache ich das?

33
Aran Mulholland

Wenn Sie diese index.htm-Datei im Browser rendern möchten, können Sie eine Controller-Aktion wie folgt erstellen:

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();
}

oder einfach per:

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

Nehmen wir an, diese Aktion befindet sich in Home Controller, und einige Benutzertreffer http://yoursite.com/Home/GetHtml werden dann gerendert.

EDIT: 2 andere Methoden

Wenn Sie eine rohe HTML-Datei von index.htm im Browser anzeigen möchten:

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"); 
}

Wenn Sie nur eine Datei herunterladen möchten:

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

Überprüfen Sie dies heraus:

    public ActionResult Index()
    {
        return new FilePathResult("~/Html/index.htm", "text/html");
    }
45
Wahid Bitar

Ich habe die Antwort von wahid erweitert, um HtmlResult zu erstellen 

Erstellen Sie ein HTML-Ergebnis, das FilePathResult erweitert

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

Statische Methode auf dem Controller erstellt

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

verwendet wie wir zurückblicken 

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

Ich hoffe es hilft

8
om471987

Können Sie die HTML-Datei in einem String lesen und in Aktion zurückgeben? Es wird als HTML-Seite wie folgt dargestellt:

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 = Lösung\Html\index.htm

Wenn das Ziel oder der Speichermechanismus von HTML-Dateien kompliziert ist, können Sie Virtueller Pfadanbieter

Virtueller Pfadanbieter MVC-Beispiel

0
Abhijit Kadam

Ein alternativer Ansatz für die Verwendung von .net core ist die Verwendung eines FileProvider . Die Dateien können sich während der Kompilierung in einem Ordner befinden oder eingebettet sein. 

In diesem Beispiel verwenden wir eingebettete Dateien.

Fügen Sie einen Ordner in Ihrem Projekt hinzu, sagen wir Assets, erstellen Sie eine Datei myfile.html, fügen Sie der Datei say einige grundlegende HTML-Dateien hinzu

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

Klicken Sie mit der rechten Maustaste auf die neue Datei (vorausgesetzt, Sie befinden sich in Visual Studio), wählen Sie Eigenschaften aus, und wählen Sie im Eigenschaftenbildschirm/in der Build-Aktion die eingebettete Ressource aus. Die Datei wird der csproj-Datei hinzugefügt.

Klicken Sie mit der rechten Maustaste auf Ihr Projekt, und bearbeiten Sie die csproj-Datei. Überprüfen Sie, ob Ihre Eigenschaftsgruppe Folgendes enthält:

<GenerateEmbeddedFilesManifest>true</GenerateEmbeddedFilesManifest>

Wenn nicht, fügen Sie es bitte hinzu. Der csproj sollte auch die neu erstellte HTML-Datei enthalten:

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

Um die Datei in Ihrem Controller zu lesen und an den Client zu übergeben, benötigen Sie einen Dateianbieter, der der Datei "startup.cs" hinzugefügt wird

Bearbeiten Sie Ihre startup.cs, um sicherzustellen, dass sie die Hosting-Umgebung enthält:

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

Erstellen Sie dann einen Datei-Provider und machen Sie ihn zu einem Dienst, der zur Laufzeit injiziert werden kann. Erstellen Sie es wie folgt:

 var physicalProvider = HostingEnvironment.ContentRootFileProvider;
 var manifestEmbeddedProvider =
      new ManifestEmbeddedFileProvider(Assembly.GetEntryAssembly());
 var compositeProvider =
      new CompositeFileProvider(physicalProvider, manifestEmbeddedProvider);

 services.AddSingleton<IFileProvider>(compositeProvider);

Um die Datei bereitzustellen, gehen Sie zu Ihrem Controller, verwenden Sie die Abhängigkeitseingabe, um den FileProvider zu erhalten, erstellen Sie einen neuen Dienst und stellen Sie die Datei bereit. Beginnen Sie mit der Abhängigkeitsinjektion, indem Sie den Anbieter Ihrem Konstruktor hinzufügen.

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

Verwenden Sie dann den Dateianbieter in Ihrem Dienst

[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();
}

Weitere Informationen finden Sie unter ASP .Net Core-Datei-Provider-Beispiel und der Microsoft-Dokumentation hier .

0
Jason

Ich möchte meine zwei Cents einbringen. Ich habe das am knappsten gefunden und es ist schon da: 

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");
}
0
Ognyan Dimitrov