Внедрение среды IHostingEnvironment в Razor Views в ASP.NET Ядро

#c# #asp.net-core #razor-pages

#c# #asp.net-core #страницы razor

Вопрос:

Я читаю мета-теги веб-сайта из XML файла, который хранится в wwwroot папке. Способ доступа к нему заключается в использовании IHostingEnvironment но поскольку он находится в общем доступе _layout , как мне его внедрить. Я получаю ошибку

«Имя IHostingEnvironment не существует в текущем контексте.

есть ли способ установить мета-теги с помощью XML for _layout , чтобы они отображались на всех Asp.Net страницах, которые используют это _layout .

_layout.cshtml

 @using Jaeger.Services
@using Microsoft.Extensions.Configuration
@inject IConfiguration Configuration
@inject MenuMasterService menus
@using System.Xml.Linq;

    <!doctype html>
    <html lang="de">

    <head>
        @{

            var filepath = IHostingEnvironment.ContentRootPath.ToString()   @"meta-data.xml";
            XDocument xmlDoc = XDocument.Load(filepath);
            //Run query
            IEnumerable<XElement> metaList = xmlDoc.Root.Elements("meta");

            var result = from a in metaList
                         select new
                         {
                             title = a.Element("title").Value.Trim(),
                             description = a.Element("description").Value.Trim(),
                             keywords = a.Element("keywords").Value.Trim()
                         };
            //jaeger
            var xml_tilte = result.ElementAt(0).title;
            var xml_desc = result.ElementAt(0).description;

        }

        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
        @*<meta name="format-detection" content="telephone=no">*@
        <title>@ViewData["Title"] - @xml_tilte</title>
        <meta name="description" content="@xml_desc">


.....
  

Комментарии:

1. почему бы не написать пользовательский сервис для его обработки — таким образом, его можно протестировать!

2. спасибо @DanielA. Белый я рассмотрю это, я новичок в dotnet, поэтому мне придется изучить это. Но мне было интересно, есть ли какой-либо способ заставить текущий код работать.

3. спасибо, я смог сделать то, что хотел, используя service, это намного более чистый способ, чем то, что я делал ранее. Спасибо за предложение @DanielA. Белый

Ответ №1:

Согласно предложению @Daniel A. White, я написал пользовательский сервис и смог прочитать файл. Добавление пользовательского сервиса здесь может помочь кому-либо еще.

MetaReaderService.cs

 namespace Test.Services
{
    public class MetaReaderService
    {
        private readonly IHostingEnvironment _env;

        public MetaReaderService(IHostingEnvironment environment)
        {
            _env = environment;
        }

        public IEnumerable<MetaDataXMLModel> GetMetaData()
        {

            var filepath = _env.ContentRootPath.ToString()   @"meta-data.xml";
            XDocument xmlDoc = XDocument.Load(filepath);
            //Run query
            IEnumerable<XElement> metaList = xmlDoc.Root.Elements("meta");

            var result = from a in metaList
                         select new MetaDataXMLModel
                         {
                             title = a.Element("title").Value.Trim(),
                             description = a.Element("description").Value.Trim(),
                             keywords = a.Element("keywords").Value.Trim()
                         };
            
            return resu<
      }


    }

    public class MetaDataXMLModel
    {
        public string title { get; set; }
        public string description { get; set; }

        public string keywords { get; set; }

    }
}
  

_Layout.cshtml

 @using Test.Services
@using Microsoft.Extensions.Configuration
@inject MetaReaderService metaReaderXml
@inject MenuMasterService menus
<!doctype html>
<html lang="de">

<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">

    @{
        @Html.Raw(ViewData["MetaData"]);

        // loading meta title, description and keyword
        var result = metaReaderXml.GetMetaData();
    }

    <title>@ViewData["Title"] - @result.ElementAt(0).title</title>
    <meta name="description" content=" @result.ElementAt(0).description ">
    <meta name="keywords" content=" @result.ElementAt(0).keywords ">

...
  

более подробно о пользовательских сервисах здесь