2012-05-31 7 views
29

Ich habe einen speziellen Fall, wo ich eine direkte HTML-Datei von einer Controller-Aktion dienen möchte.Wie html-Datei aus einem anderen Verzeichnis als ActionResult

Ich möchte es aus einem anderen Ordner als dem Ordner Ansichten dienen. Die Datei befindet sich in

Solution\Html\index.htm 

Und ich will es von einer Standard-Controller-Aktion dienen. Könnte ich return File verwenden? Und Wie mache ich das?

Antwort

33

Wenn Sie diese Datei index.htm im Browser machen, dann können Sie 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 nur von:

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

können also sagen, diese Aktion in Startseite Controller und einige Benutzer trifft http://yoursite.com/Home/GetHtml dann index.htm gemacht werden.

EDIT: 2 andere Methoden

Wenn Sie rohe html von index.htm im Browser sehen 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 wollen einfach nur Datei herunterladen:

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

'Server.MapPath' ist nicht erforderlich. Versuchen Sie 'return File (" ~/Html/index.htm "," text/html ");' –

+1

Welche Bibliothek benötigen Sie, um 'File()' zu verwenden? –

0

Können Sie die HTML-Datei in einer Zeichenfolge lesen und in Aktion zurückgeben? Es wird als HTML-Seite dargestellt, wie unten 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 Speichermechanismus von HTML-Dateien kompliziert ist, dann können Sie Sie Virtual path provider

Virtual path provider MVC sample

38

Überprüfen Sie diese:

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

beste anwer.Works perfekt – om471987

+0

Sie sind herzlich willkommen mein Freund :) –

+1

'return File (" ~/Html/index.htm "," Text/html ");' ist die kürzeste Antwort; D –

7

ich erweiterte Antwort des wahid HtmlResult

Html Ergebnis, das FilePathResult

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

Erstellt statische Methode auf

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

wie wir zurückkommen

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

Ich hoffe, es hilft

+0

schön .........-> –

0

Ich möchte meine zwei Cent in.Ich habe das am knappen 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"); 
}