Как использовать html-файл из другого каталога как ActionResult

У меня есть специальный случай, когда я хочу использовать прямой HTML-файл из действия контроллера.

Я хочу обслуживать его из другой папки, кроме папки «Просмотры». Файл находится в

Solution\Html\index.htm

И я хочу обслужить его из стандартного действия контроллера. Могу ли я использовать возвратный файл? И как мне это сделать?


person Aran Mulholland    schedule 31.05.2012    source источник


Ответы (6)


Если вы хотите отобразить этот файл 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 других метода

Если вы хотите видеть в браузере необработанный HTML-код index.htm:

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"); 
}
person lucask    schedule 31.05.2012
comment
Server.MapPath не требуется. просто попробуйте return File("~/Html/index.htm", "text/html"); - person S.Serpooshan; 15.10.2016
comment
Какую библиотеку вам нужно использовать, чтобы использовать File()? - person Zach Smith; 06.09.2017
comment
Хорошо, но это не загрузит файлы, на которые ссылается этот файл index.htm, которые находятся в его каталоге, верно? - person Bartosz; 02.08.2018
comment
@Bartosz Да, конечно, ты прав. Это просто для возврата обычного html файла - person Wahid Bitar; 04.11.2018

Проверь это :

    public ActionResult Index()
    {
        return new FilePathResult("~/Html/index.htm", "text/html");
    }
person Wahid Bitar    schedule 31.05.2012
comment
return File("~/Html/index.htm", "text/html"); - самый короткий ответ; D - person S.Serpooshan; 15.10.2016
comment
как кодировать html файл, я вижу некоторые странные символы в html файле - person Geetesh; 01.11.2018

Я расширил ответ wahid, чтобы создать HtmlResult

Создать результат Html, расширяющий FilePathResult

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

Надеюсь, поможет

person om471987    schedule 04.05.2013

Я хочу вложить свои два цента. Я нашел это очень кратким, и он уже там:

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");
}
person Ognyan Dimitrov    schedule 31.05.2017

Можете ли вы прочитать 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? File = Решение \ Html \ index.htm

Если механизм назначения или хранения файлов HTML сложен, вы можете Поставщик виртуального пути

Пример MVC поставщика виртуального пути

person Abhijit-K    schedule 31.05.2012

Альтернативный подход при использовании ядра .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 здесь.

person Jason    schedule 15.01.2019