Asp net core вернуть html файл

Обновлено: 07.07.2024

У меня есть URL-адреса, хранящиеся в базе данных, где пробелы закодированы как + . Когда браузер запрашивает эти URL-адреса, веб-сервер возвращает ответ 404. Все эти URL-адреса предназначены для статических изображений, хранящихся на веб-сервере в папке wwwroot. Если я вручную заменю + на %20 , то изображение будет возвращено правильно.

Я видел другой вопрос это, но он конкретно связан с вызовами API, и ответ, похоже, не применим к моему вопросу, поскольку нет маршрутов для изменения, поскольку я запрашиваю файлы статических изображений.

Обновлено: дополнительная деталь HTML выводится с использованием @Html.Raw(html) В результате HTML-вывод в браузере имеет форму <img src="https://reddeveloper.ru/BorderThemes/grey+4px+rounded+corners_TL.jpg" />

Html был сгенерирован на сервере, а затем сохранен в БД, поэтому мы можем быть уверены, что вывод в браузер безопасен, и, нет, я понятия не имею, почему кто-то будет делать это, а не создавать HTML, когда это необходимо, но это было раньше. мое время, и это ситуация, в которой я уже нахожусь.

У меня были проблемы с paths / html, хранящимися в БД, но после экспериментов выяснилось, что System.Net.WebUtility.UrlEncode кодирует пробелы как + . Например, WebUtility.UrlEncode("foo bar.jpg") возвращает foo+bar.jpg , который IIS отклоняет как дважды закодированный.

Мне что-то не хватает, или функция Microsoft для кодирования URL-адресов кодирует URL-адреса способом, который веб-сервер Microsoft отклоняет?

Можно было бы сделать с образцом кода, прежде чем решить, ошибка это или нет; «как» и ваше использование важны. Я больше из мира веб-форм, но в некоторых местах я привык вызывать функцию UrlEncode ().

@Phill - Я добавил дополнительную информацию - при создании страницы не выполняется кодирование, оно было закодировано ранее и сохранено в БД (часто много лет назад). Мне просто нужно вывести фрагменты как часть страницы.

Вам нужно не допустить, чтобы знаки + не были созданы. Если ваша база данных содержит эти + , вам необходимо удалить их. В частности, не используйте UrlEncode() ! Чтобы получить дополнительную помощь, (1) покажите, как заполняется переменная html , и (2) покажите, как переменная html используется в вашем коде Razor.

@Peter B - Моя проблема в том, что я ничего не кодирую, во многих случаях это было закодировано много лет назад и сохранено в БД. Я бы предпочел избегать синтаксического анализа всех сохраненных фрагментов HTML и их повторного кодирования.

После того, как вы протестировали их в Chrome, также проверьте их в Postman. У вас там такие же результаты?

Добавление тег-хэлперов для использования в представлении

Если вы создаете новый MVC 6 проект с помощью Visual Studio, то встроенные тег-хэлперы будут доступны по умолчанию. Можно добавить тег-хэлперы из любой сборки / пространства имен, используя директиву @addTagHelper в cshtml файлах.

Чтобы добавить тег-хэлперы глобально для всего проекта, добавьте директиву @addTagHelper в файл Views/_ViewImports.cshtml.

Link и Script

Рисунок 1

Как видно из их названий, эти тег-хэлперы созданы для упрощения добавления тегов link и script в создаваемую HTML разметку. Например, с их помощью можно упростить добавление ссылок на большое число файлов в девелопмент среде, использование CDN с откатом на локальные файлы и инвалидацию кеша.
Рассмотрим пример, в котором мы хотим добавить ссылки на все js файлы в определенной папке (рисунок 1).

Мы можем это легко сделать с помощью тег-хэлпера Script, добавив все файлы по шаблону:

В результате будет сгенерирована следующая HTML разметка:

В данном примере мы использовали шаблон /app/**/*.js, потому что нам нужно было включить еще и js файлы из подпапок. Если же мы хотим добавить ссылки на все js файлы из одной папки, то используем шаблон /app/*.js.
Наряду с атрибутом asp-src-include существует и атрибут asp-src-exclude. Например, в предыдущем примере мы можем сделать так, чтобы ссылки на js файлы в подпапке services не были добавлены:

Тег-хэлпер Link работает точно так же, только с атрибутами asp-href-include и asp-href-exclude.
Теперь рассмотрим атрибуты этих тег-хэлперов, которые помогут подключать CDN. Преимущества использования CDN для хостинга файлов таких популярных фреймворков как jQuery и Bootstrap очевидны: уменьшается нагрузка на наши сервера и потенциально увеличивается производительность у клиента (например, актуальная версия файла уже может быть в кеше браузера у клиента). Среди минусов – нужно предусмотреть возможность того, что CDN не отвечает и нам нужно отдавать файлы со своего сервера. С помощью тег-хэлперов это сделать проще:

Атрибуты asp-fallback-test позволяют указать свойства или объекты, которые нужно проверить для того, чтобы узнать, был ли загружен файл или нет. Если нет, то файл будет загружен с использованием пути, заданном в атрибуте asp-fallback-href. Сгенерированная HTML разметка:

Cache busting (инвалидация кеша) – механизм, добавляющий идентификатор версии файла (на основе его содержимого) к имени файла для css и js файлов. В этом случае можно указать браузеру, что эти файлы можно кешировать на неопределенно долгое время, в случае их изменения имя у них также изменится. Для того чтобы включить этот механизм, достаточно добавить атрибут asp-append-version:

Environment

Тег-хэлпер Environment используется (обычно вместе с тег-хэлперами Link и Script) для генерирования различной HTML разметки в зависимости от среды: девелопмент vs тест vs продакшен. Этот тег-хэлпер используется следующим образом: оберните в этот тег часть HTML кода и укажите среду или среды, для которых эта часть разметки должна быть включена в выходной файл. В следующем примере в девелопмент среде мы подключаем все css файлы по отдельности, а в средах Staging и Production используем скомбинированную минифицированную версию.

В девелопмент среде будет сгенерирован следующий HTML код:

В средах Staging и Production будет добавлена ссылка на минифицированную версию:

  • Кликнуть правой кнопкой мыши по проекту в обозревателе решений и выбрать Свойства.
  • Выбрать вкладку Debug (Отладка).
  • Нажмите New… для создания нового профиля и назовите его “IIS Express – Prod”.
  • В выпадающем списке Launch выберите “IIS Express”.
  • Добавьте новую переменную окружения с именем “Hosting:Environment” и значением “Production”.
  • Сохраните проект.

Рисунок 4

Теперь в выпадающем списке Run в Visual Studio можно выбрать профиль “IIS Express – Prod” (рисунок 4).

Именно в этом разделе тег-хэлперы делают свою работу лучше всего, увеличивая читаемость и простоту cshtml представлений. В качестве примера рассмотрим простую логин форму со следующей моделью:

Теперь посмотрим, как можно сгенерировать поле ввода для свойства UserName.

Почему подход с тег-хэлперами лучше? Код с ними становится читаемее и проще. Например, мы хотим добавить к полю ввода класс:

В данном случае код с использованием тег-хэлперов однозначно выигрывает и в красоте, и в простоте.
Теперь приведем код всей формы логина в двух вариантах.

Та же самая форма с использованием тег-хэлперов

Рисунок 5

Как мы видим, версия с тег-хэлперами выглядит проще и читаемее. Особенно мне нравится отсутствие выражения using для генерации формы, мне всегда это казалось каким-то хаком. Еще стоит отметить, что нам теперь не нужно явно добавлять AntiForgeryToken на форму. Тег-хэлпер form делает это автоматически, если не отключить это поведение атрибутом asp-anti-forgery=”false”.
Конечно, Visual Studio подсвечивает атрибуты тег-хэлперы, чтобы их легко можно было отличить от стандартных HTML атрибутов (рисунок 5):

image

Внутри атрибутов asp-for работает IntelliSense, подсказывающий имена свойств модели (рисунок 6).

Теперь рассмотрим атрибуты тег-хэлпера form. Например для того, чтобы связать форму с определенным действием определенного контроллера, используются атрибуты asp-controller и asp-action:

В результате будет сгенерирована следующая HTML разметка:

Как мы видим, по умолчанию добавляется AntiForgeryKey, а методу формы присваивается значение POST. Это поведение можно изменить, добавив в разметку переопределение атрибута method. Все HTML атрибуты, добавленные в разметку, попадут в сгенерированный код. Однако стоит учесть, что нельзя одновременно задать атрибут action и один из атрибутов asp-controller / asp-action, в этом случае будет выброшено исключение: «Cannot override the ‘action’ attribute for . A with a specified ‘action’ must not have attributes starting with ‘asp-route-‘ or an ‘asp-action’ or ‘asp-controller’ attribute.»
Иногда действию контроллера нужно передать дополнительные параметры. Это можно сделать с помощью атрибутов, начинающихся с asp-route-. Например, в действие Login часто передается параметр ReturnUrl, вот как это можно сделать с использованием тег-хэлперов:

В итоге будет сгенерирован такой HTML код:

Используя такой синтаксис, можно указывать столько параметров, сколько необходимо.
Еще тег-хэлпер form поддерживает возможность указать именованный маршрут вместо пары контроллер / действие. Предположим, что мы определили маршрут с именем login в MVC коде:

Тогда мы можем указать этот маршрут для формы, используя атрибут asp-route:

Что в свою очередь сгенерирует точно такую же HTML разметку, как и в предыдущем случае:

Input

Тег-хэлпер input является альтернативой Html.EditorFor. В следующем примере будем использовать такой простой класс модели представления:

Поле ввода для Email можно создать с помощью asp-for атрибута:

В результате чего получим следующую HTML разметку:

В этом случае в сгенерированной HTML разметке будет атрибут data-val-required, который используется jQuery Validation.

В представлении мы можем создать поле ввода для Address.AddressLine1:

В результате получим следующий HTML код:

В этом случае число будет показано с 4 знаками после запятой, например, 1.2000. Никаких дополнительных атрибутов не добавляется.
Как мы уже говорили, Visual Studio предоставляет IntelliSense для тег-хэлпера input, подсвечивает ошибки, если есть ошибка в имени свойства. Исключение в таком случае будет выброшено во время компиляции, но по умолчанию Razor представления не прекомпилируются, поэтому эта ошибка будет видна только при первом обращении к странице.

TextArea

Тег-хэлпер textarea во многом похож на ранее рассмотренный input и является альтернативой Html.TextAreaFor. Он также использует атрибут asp-for. Рассмотрим следующую модель представления:

Мы используем тег-хэлпер textarea следующим образом:

Что сгенерирует следующую HTML разметку:

В сгенерированном элементе textarea определены name, id, добавлены валидационные атрибуты.

Validation

Это сгенерирует следующую HTML разметку, в случае если поле Email было сделано обязательным, но не было заполнено:

Этот код сгенерирует следующую разметку в случае, когда валидационных ошибок нет:

Если же у нас есть ошибки валидации:

Label

Тег-хэлпер label является самым скучным простым тег-хэлпером, заменой Html.LabelFor. Его единственная задача – сгенерировать элемент label для поля, имя которого указано в атрибуте asp-for. Значение для содержимого этого label задается свойством Name атрибута Description. Рассмотрим такую модель представления:

Теперь используем тег-хэлпер label:

Что в результате даст нам следующую HTML разметку:

Select

Тег-хэлпер select используется для создания выпадающих списков в HTML разметке вместо Html.DropDownListFor. Пусть у нас есть модель со свойством CountryCode, которое мы хотим заполнять с помощью выпадающего списка:

Теперь с помощью тег-хэлпера свяжем это поле с элементом select.

И получим следующий HTML код:

Конечно, этот код не несет практической ценности, потому что выпадающий список еще пуст. Есть 2 способа его заполнить. Первый (для совсем маленьких списков): все возможные варианты задать вручную в представлении:

В этом случае значение будет выбрано исходя из значения свойства в модели. Например, если CountryCode равен “CA”, будет сгенерирована следующая HTML разметка:

Второй способ задания возможных значений – динамическая загрузка из источника данных. Для этого нужен источник данных типа IEnumerable<SelectListItem> (или SelectList), пусть в нашем случае он доступен в ViewBag.Countries. Для привязки источника данных используется атрибут asp-items:

Для того, чтобы сгенерированный элемент select поддерживать возможность выбора нескольких элементов, достаточно, чтобы свойство модели имело тип IEnumerable, например:

В коде использования тег-хэлпера ничего не меняем:

Но сгенерированная HTML разметка будет другой:

Anchor

Тег-хэлпер anchor служит для генерации ссылок и является заменой как Html.ActionLink, так и Url.Action, с помощью которых мы обычно писали вот так:

И в результате получали две одинаковые ссылки:

Теперь с помощью тег-хэлпера anchor и атрибутов asp-controller, asp-action ссылку можно добавить следующим образом:

Как и в случае остальных тег-хэлперов, их использование позволяет проще добавить дополнительные классы и атрибуты для этих элементов, в отличие от Html.ActionLink(«Register », «Create», “Account”, null, new < class= «css-class»> ).
Если в метод контроллера надо передать дополнительные параметры, то это можно сделать так же, как и для тег-хэлпера form: с помощью атрибутов asp-route-*, например:

Также можно указать именованный маршрут (опять точно так же, как для form):

Ранее используемый Html.ActionLink позволял указать протокол, хост и фрагмент генерируемого URL. У тег-хэлпера есть для этого свои атрибуты:

Cache

У тег-хэлпера cache нет аналога среди Html хэлперов, да и обычным HTML элементом он не является. Он позволяет закешировать свое содержимое в памяти. Перед каждой обработкой своего содержимого он проверяет, не было ли оно уже сохранено в MemoryCache. Если содержимое найдено в кеше, оно отправляется сразу в Razor движок, если нет – сначала Razor обработает его, а потом оно сохранится в кеш. По умолчанию тег-хэлпер сгенерирует уникальный ID своего содержимого. Вот так его можно использовать в представлениях:

    expires-after: задает промежуток времени от текущего момента, во время которого кеш считается валидным, например, 5 секунд. Атрибут expires-after ожидает объект типа TimeSpan:

Ограничения этого тег-хэлпера связаны с тем, что он использует MemoryCache в свое реализации. Первое ограничение связано с тем, что любой перезапуск процесса, ресайкл пула приложения и похожее действие инвалидирует весь наш кеш, в облаке такое может произойти, если сайт переедет на новую машину. Поэтому нельзя считать этот кеш надежным. Второе ограничение также связано с тем, что кеш хранится в памяти. Если пользователь в рамках сессии будет перенаправлен на разные веб-сервера, потенциально он может увидеть разное содержимое одного и того же элемента. Это связано с тем, что у каждого сервера будет своя версия кеша, реализация MemoryCache не является распределенной. В данном случае может помочь привязка пользователя к одному и тому же серверу (sticky session, server affinity).

Image

Этот простой в использовании тег-хэлпер состоит из всего одного атрибута asp-append-version, добавляемого к тегу img. Если передать этому атрибуту значение true, то к URL изображения будет добавлена строка, зависящая от содержимого картинки (как и в случае css / js файлов), что позволит браузеру кешировать ее неопределенно долгое время.

В результате будет сгенерирована похожая HTML разметка:

Использование этого тег-хэлпера упрощает выбор политики кеширования изображений сайта: при маленьком времени кеширования нивелируется выгода от его применения, при большом – потенциально при обновлении изображения клиент в течение долгого времени продолжает использовать старую локально закешированную версию изображения.

Сначала я попытался вернуть html файл через контроллер. Я пробовал этот маршрут:

И затем в контроллере я возвращаю html файл следующим образом:

Это не сработало. Он вернул 404 не найденное исключение и дал путь, но путь, который он дал, был правильным путем к файлу index.html(я вырезал и вставил его в проводник и файл открыл).

Я также объявляю их при запуске:

Затем я попытался удалить маршрут по умолчанию. Теперь я могу добраться до файла index.html, но только если я введу имя файла, то есть:

Если я попытаюсь получить доступ к корню домена без указанного "index.html", я получаю ошибку 404.

Каков правильный способ ссылки на index.html как страницу по умолчанию? Я предполагаю, что делать это с контроллера, вероятно, лучше, потому что тогда он будет совместим с маршрутизацией angular без перезаписи.

ОТВЕТЫ

Ответ 1

Просто используйте это в startup.cs :

Это сокращение для:

. и это устраняет проблемы с необходимостью иметь их в правильном порядке (как показано выше)

Ответ 2

Мне нужно было объявить UseDefaultFiles() перед UseStaticFiles().

Ответ 3

Теперь в методе Startup.Configure добавьте:

Теперь вы должны получать файлы из wwwroot (используйте UseWebRoot если вы хотите изменить его на что-то другое).

Ответ 4

Это оптимально, поскольку UseDefaultFiles переписывания URL UseDefaultFiles будет искать только UseDefaultFiles index.html , а не устаревшие файлы: default.htm , default.html и index.htm .

Ответ 5

Если вы хотите использовать другой документ, например foo.html, в качестве документа по умолчанию, вы можете сделать это, используя следующий код в методе Startup.Configure.

Подход 2:

UseFileServer сочетает в себе функциональность промежуточного программного обеспечения UseStaticFiles , UseDefaultFiles и UseDirectoryBrowser . Промежуточное программное обеспечение DirectoryBrowser, позволяет просматривать каталоги и позволяет пользователям просматривать файлы в указанном каталоге. Мы могли бы заменить промежуточное ПО UseStaticFiles и UseDefaultFiles на промежуточное ПО UseFileServer .

Ответ 6

Вы смешиваете как файлы MVC, так и файлы по умолчанию, используемые (useDefaultFiles). Прокомментируйте приведенные ниже строки из вашего кода.


Получить ID формы в контроллере
Здравствуйте, есть контроллер. public ActionResult Update(Object Model) .

Как _необычно_ получить данные из формы ?
То есть обычно запрос денлается так: request.form('имя поля') а мне нужно что-то типа n='имя.

Как Получить Данные Из Другой Формы?
Есть 2 формы: 1) Персонал с полем personName 2) Руководитель с полем OrgLeader на лебел.

CGI. Как получить данные из html формы и отослать данные клиенту в html формате?
Господа помогите с cgi. Никогда этого не делал под VB, а сейчас очень надо. Как получить данные из.

Entity Fгarnework не используется, как с ним делать понятно. А вот без него ничего толкового найти не удалось (

EF Тут причем? Он АБСОЛЮТНО НИКАК не учавствует в передачи данных между формой и контроллером.
Создавайте класс модель и передавайте что хотите

видимо не так выразился, т.е. без модели никак не передать? видимо не так выразился, т.е. без модели никак не передать?

Можете передавать параметрами в метод

Добавлено через 12 минут
А если форма большая? Не передавать же все элементы через запятую. Нет ли варианта передать всю форму, как массив скажем

А если форма большая? Не передавать же все элементы через запятую. Нет ли варианта передать всю форму, как массив скажем

Не зря же в авбривиатуре MVC для модели выделили целую букву в самом начале.
А вообще достук к форме из контроллера еще можно плучить так

а как быть в случае передачи формы через ajax, например
Передается точно так же. Модель сериализуется в формат JSON и передается в контроллер. Контроллер сам переведет в нужный класс.
Помнится в Type Script когда делал, так отдельно сервис писал и все модели представления из проекта дублировал. а вот значение поля типа "file" не передается
Как передать и это поле, сам файл передавать при этом не надо!

Потому что там другой механизм передачи.

Обьясните еще раз, зачем вам эти костыли?
Я же вам писал уже что все данные формы можно достать из Request.From

Файлы можно достать из Request.Form.Files

Просто учусь и не знаю где костыль, а где правильное решение.
1) про Request.Form:
при передаче данных формы через ajax запрос я в контроллере через поля Request.Form ничего не получаю
2) получается такая картина:
если я хочу передать данные формы (без учета полей типа file), то можно через ajax, FormData или просто передать форму и получить ее поля в контроллере;
Если нужно передать данные формы с полями типа file, то остается вариант только через Request.Form или через FormData, но уже с передачей и содержимого файла, а не только названия
так?

Добавлено через 1 час 50 минут
ответ с передачей имени файла через запрос ajax подсказали на **********************


Как получить в приложении данные из html формы?
Доброго времени суток. Интересует следующий вопрос: Есть приложение на pyqt, в котором.

Как из одной формы получить данные другой?
хай ол пипл. у меня ситуация вот например у меня на форме есть текст(лейбл) и естькнопка(баттон).

Как получить данные из формы в этом же файле?
Проблема такая есть форма в PHP файле test.php, к примеру: &lt;form&gt; &lt;input type='text' name='hz'.

Как получить данные из ComboBox'а с другой формы?
Использую С++Builder6. Имеется две формы и организован переход между ними через hide\show. На.

Читайте также: