コントローラーアクションからストレートHTMLファイルを提供したい特殊なケースがあります。
Viewsフォルダ以外の別のフォルダから提供したい。ファイルはにあります
Solution\Html\index.htm
そして、標準のコントローラーアクションから提供したいと思います。 Return Fileを使用できますか?そして、これをどうやってやるの?
ブラウザでこのindex.htmファイルをレンダリングする場合は、次のようなコントローラーアクションを作成できます。
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();
}
または単に:
public ActionResult GetHtml()
{
return File(Server.MapPath("/Solution/Html/") + "index.htm", "text/html");
}
このアクションがHomeコントローラーにあり、一部のユーザーが http://yoursite.com/Home/GetHtml とすると、index.htmがレンダリングされます。
編集:他の2つの方法
ブラウザでindex.htmの生のHTMLを表示する場合:
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");
}
ファイルをダウンロードするだけの場合:
public FilePathResult GetHtml()
{
return File(Server.MapPath("/Solution/Html/") + "index.htm", "text/html", "index.htm");
}
これをチェックしてください:
public ActionResult Index()
{
return new FilePathResult("~/Html/index.htm", "text/html");
}
私はwahidの答えを拡張してHtmlResultを作成しました
FilePathResultを拡張するHtml Resultを作成します
public class HtmlResult : FilePathResult
{
public HtmlResult(string path)
: base(path, "text/html")
{
}
}
コントローラーに静的メソッドを作成しました
public static HtmlResult Html(this Controller controller, string path)
{
return new HtmlResult(path);
}
ビューを返すように使用
public HtmlResult Index()
{
return this.Html("~/Index.html");
}
それが役に立てば幸い
HTMLファイルを文字列で読み取り、実際に返すことができますか?以下に示すように、Htmlページとしてレンダリングされます。
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
HTMLファイルの保存先または保存メカニズムが複雑な場合は、次のことができます 仮想パスプロバイダー
.netコアを使用する場合の代替アプローチは、FileProviderを使用することです。ファイルはフォルダーにあるか、コンパイル時に埋め込まれます。
この例では、埋め込みファイルを使用します。
プロジェクトにフォルダーを追加します。アセットとしましょう。その中にファイルmyfile.htmlを作成し、ファイルに基本的なhtmlを追加します。
<html>
<head>
<title>Test</title>
</head>
<body>
Hello World
</body>
</html>
新しいファイルを右クリックし(Visual Studioを使用している場合)、プロパティを選択し、プロパティ画面/ビルドアクションで埋め込みリソースを選択します。ファイルがcsprojファイルに追加されます。
プロジェクトを右クリックして、csprojファイルを編集します。プロパティグループに次が含まれていることを確認します。
<GenerateEmbeddedFilesManifest>true</GenerateEmbeddedFilesManifest>
そうでない場合は追加してください。 csprojには、新しく作成されたhtmlファイルも次のように含める必要があります。
<ItemGroup>
<EmbeddedResource Include="assets\myfile.html" />
</ItemGroup>
コントローラーでファイルを読み取り、クライアントに渡すには、startup.csに追加されるファイルプロバイダーが必要です。
Startup.csを編集して、HostingEnvironmentが含まれていることを確認します。
private readonly IHostingEnvironment HostingEnvironment;
public Startup(IHostingEnvironment hostingEnvironment)
{
HostingEnvironment = hostingEnvironment;
}
次に、ファイルプロバイダーを作成し、実行時に挿入できるサービスにします。次のように作成します。
var physicalProvider = HostingEnvironment.ContentRootFileProvider;
var manifestEmbeddedProvider =
new ManifestEmbeddedFileProvider(Assembly.GetEntryAssembly());
var compositeProvider =
new CompositeFileProvider(physicalProvider, manifestEmbeddedProvider);
services.AddSingleton<IFileProvider>(compositeProvider);
ファイルを提供するには、コントローラーに移動し、依存性注入を使用してFileProviderを取得し、新しいサービスを作成してファイルを提供します。これを行うには、プロバイダーをコンストラクターに追加して、依存関係の注入から始めます。
IFileProvider _fileProvider;
public MyController(IFileProvider fileProvider)
{
this._fileProvider = fileProvider;
}
次に、サービスでファイルプロバイダーを使用します
[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();
}
詳細については、ASP 。Net Core file provider sample およびMicrosoftのドキュメント here を参照してください。
私は2セントを入れたいです。私はこの最も簡潔なものを見つけました、そしてそれはすでにそこにあります:
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");
}