web-dev-qa-db-ja.com

別のディレクトリからhtmlファイルをActionResultとして提供する方法

コントローラーアクションからストレートHTMLファイルを提供したい特殊なケースがあります。

Viewsフォルダ以外の別のフォルダから提供したい。ファイルはにあります

Solution\Html\index.htm

そして、標準のコントローラーアクションから提供したいと思います。 Return Fileを使用できますか?そして、これをどうやってやるの?

35
Aran Mulholland

ブラウザでこの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"); 
}
40
lucask

これをチェックしてください:

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

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

それが役に立てば幸い

8
om471987

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ファイルの保存先または保存メカニズムが複雑な場合は、次のことができます 仮想パスプロバイダー

仮想パスプロバイダーMVCサンプル

0
Abhijit_K

.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 を参照してください。

0
Jason

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