36

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

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

Solution\Html\index.htm

そして、私はそれを標準のコントローラーアクションから提供したいと思います。リターンファイルを使用できますか?そして、どうすればこれを行うことができますか?

4

6 に答える 6

43

この 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"); 
}
于 2012-05-31T09:30:21.420 に答える
0

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=ソリューション\Html\index.htm

HTML ファイルの宛先または保存メカニズムが複雑な場合は、仮想パス プロバイダーを使用できます。

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

于 2012-05-31T09:29:13.887 に答える
0

.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 ファイル プロバイダーのサンプルと Microsoft のドキュメントを参照してください

于 2019-01-15T09:14:33.273 に答える