#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 ">
...
более подробно о пользовательских сервисах здесь