Подтвердить что ты не робот

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

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

Я хочу использовать его из другой папки, кроме папки Views. Файл находится в

Solution\Html\index.htm

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

4b9b3361

Ответ 1

Если вы хотите отобразить этот файл 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"); 
}

Итак, скажем, это действие находится в Домашнем контроллере, а некоторые пользователи нажимают http://yoursite.com/Home/GetHtml, тогда будет отображаться index.htm.

EDIT: 2 других метода

Если вы хотите увидеть raw 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"); 
}

Ответ 2

Проверьте это:

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

Ответ 3

Я продлил 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");
}

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

Ответ 4

Вы можете прочитать 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 сложный, вы можете поставщик виртуального пути

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

Ответ 5

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

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

Ответ 6

Альтернативный подход при использовании ядра .net заключается в использовании FileProvider. Файлы могут быть в папке или встроены во время компиляции.

В этом примере мы будем использовать встроенные файлы.

Добавьте в ваш проект папку, скажем, assets, в ней создайте файл 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 здесь.