我有一个专门的案例,我希望从Controller Action提供一个直接的html文件。
我想从Views文件夹以外的其他文件夹中提供它。该文件位于
Solution\Html\index.htm
我想从标准的控制器动作中提供它。我可以使用返回文件吗?和 我该怎么做?
答案 0 :(得分:45)
检查出来:
public ActionResult Index()
{
return new FilePathResult("~/Html/index.htm", "text/html");
}
答案 1 :(得分:40)
如果要在浏览器中呈现此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");
}
答案 2 :(得分:8)
我扩展了wahid的答案来创建HtmlResult
创建扩展FilePathResult的Html结果
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");
}
希望有所帮助
答案 3 :(得分: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;
}
主页/ GetHtmlFile?文件=解\ HTML \ index.htm的
如果HTML文件的目标或存储机制很复杂,那么您可以Virtual path provider
答案 4 :(得分:0)
我想把我的两分钱放进去。我发现这个最简洁,它已经存在了:
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");
}
答案 5 :(得分: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 file provider sample和Microsoft文档here。