Как изменить заголовок и другие html-элементы в заголовке HTML-документа в Razor Components?

Я довольно новичок в Razor Components и я хотел бы изменить title и другие данные внутри HTML-документаhead в зависимости от того, какую страницу посещает пользователь (например, если пользователь заходит на страницу продукта продукта X, я хочу изменить title и другие соответствующие данные в head соответственно). Я уже заглянул на https://github.com/aspnet/Blazor/issues/1311, но представленные решения выглядят немного странно. Я также знаю, что я мог бы теоретически использовать JavaScript interop для достижения моих целей, но это также кажется немного грязным.

Я попытался сделать приложение так:

@page "{*clientPath}"

<!DOCTYPE html>
<html>
    @(await Html.RenderComponentAsync<App>())
</html>

Но попытка не удалась из-за ошибки в components.server.js (Uncaught Error: There is no browser renderer with ID 0.). Я знаю, что не должен помещать JavaScript-теги в компоненты, но я решил попробовать.

Надеюсь, вы, ребята, можете мне помочь. Спасибо за прочтение.:)

0 ответов

Я нашел NuGet, который упрощает его: Toolbelt.Blazor.HeadElement

Startup.cs

using Toolbelt.Blazor.Extensions.DependencyInjection;

 public void ConfigureServices(IServiceCollection services)
    {
        services.AddHeadElementHelper();

Затем все, что вам нужно сделать, это добавить компонент на свою страницу:

@page "/customers"

<Toolbelt.Blazor.HeadElement.Title>
    Customers
</Toolbelt.Blazor.HeadElement.Title>
<h1>Customers</h1>

Результат будет

<title>customers<title> 

в вашем разделе головы. Этот плагин также имеет компоненты для метатегов и ссылок.

Вот как это сделал honkmother ( https://github.com/honkmother). Вот ссылка: https://github.com/aspnet/Blazor/issues/842

Index.cshtml:

@page "{*clientPath}"

<!DOCTYPE html>
<html>

@(await Html.RenderComponentAsync<html>())

</html>

Затем два класса, называемые "html" и "metatags". Класс html создает теги html и сохраняет заголовок (теги сценария и т. Д.) Внутри html-файла, который вводится как разметка.

public class html : ComponentBase
{
    public static string HeadTXT = File.ReadAllText("head.htm");
    Metatags meta = new Metatags() { Title = "some title" };
    protected override void BuildRenderTree(Microsoft.AspNetCore.Components.RenderTree.RenderTreeBuilder builder)
    {

        builder.OpenElement(0, "head");
        builder.AddMarkupContent(1, HeadTXT);
        builder.OpenComponent<Head>(2);
        builder.AddAttribute(3, "MetaInfo", meta);
        builder.CloseComponent();
        builder.CloseElement();

        builder.OpenElement(4, "body");
        builder.OpenComponent<Body>(5);
        builder.AddAttribute(6, "MetaInfo", meta);
        builder.CloseComponent();
        builder.AddMarkupContent(7, "<script src=\"_framework/components.server.js\"></script>");
        builder.CloseElement();

    }
}

public class Metatags
{
    public string Title { get; set; } = "example.nyc — weirdest hack ever";
    public string Description { get; set; } = "testing";
    public Head Component;
}

Компонент "тело".

<DetectPrerender MetaInfo="@MetaInfo">
    <Router AppAssembly="typeof(Startup).Assembly" />
</DetectPrerender>


@functions {

    [Parameter]
    private Metatags MetaInfo { get; set; }

}

И "головной" компонент.

@using example.Shared

<title>@MetaInfo.Title</title>
<meta name="description" content="@MetaInfo.Description">
@{
    MetaInfo.Component = this;
}
@functions {

    [Parameter]
    private Metatags MetaInfo { get; set; }
    private bool ShouldRend = false;
    protected override bool ShouldRender()
    {
        if (ShouldRend)
        {
            ShouldRend = false;
            return true;
        }
        return false;
    }

    public void ShouldRe()
    {
        ShouldRend = true;
        base.Invoke(() => base.StateHasChanged());
    }

}
Другие вопросы по тегам