Задать вопрос
DmitryITWorksMakarov
@DmitryITWorksMakarov

Почему не работают TagHelpers?

Изучаю ASP.NET CORE MVC.
Версия .net core 2.1.402.

Учебный пример: интернет-магазин.
При нажатии на кнопку "Добавить" товар должен добавиться в корзину и должна отобразиться страница корзины.

В проекте есть папка "Views", в ней есть:
Product\List.cshtml
@model ProductsListViewModel

@foreach (var p in Model.Products)
{
    @Html.Partial("_ProductSummary", p)
}

Shared\_Layout.cshtml
<!DOCTYPE html>

<html>
    <head>
        <meta name="viewport" content="width=device-width" />
        <title>Магазин</title>
    </head>
    <body>
           @RenderBody()
    </body>
</html>

Shared\_ProductSummary.cshtml
@model Product

<div>
    <div>
        <div>@Model.Name</div>
        <div>@Model.Price.ToString("c",  System.Globalization.CultureInfo.CreateSpecificCulture("en-US"))<div>
        <div>@Model.Description</div>
    <div>
    <form id="@Model.ProductID" asp-action="AddToCart" asp-controller="Cart" method="post">
        <input type="hidden" asp-for="ProductID" />
        <input type="hidden" name="returnUrl" value="@ViewContext.HttpContext.Request.PathAndQuery()" />
        <button type="submit">Добавить</button>
    </form>
</div>

_ViewStart.cshtml
@{
    Layout = "_Layout";
}

_ViewImports.cshtml
@using Store.Models
@using Store.Models.ViewModels
@using Store.Infrastructure
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
@addTagHelper Store.Infrastructure.*, Store

Startup.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.DependencyInjection;
using Store.Models;
using Microsoft.Extensions.Configuration;
using Microsoft.EntityFrameworkCore;

namespace Store
{
    public class Startup
    {
        string _ContentRootPath;

        IConfigurationRoot Configuration;

        public Startup(IHostingEnvironment env)
        {
            _ContentRootPath = env.ContentRootPath;
            
            Configuration = new ConfigurationBuilder()
                                .SetBasePath(env.ContentRootPath)
                                .AddJsonFile("appsettings.json")
                                .Build();
        }

        public void ConfigureServices(IServiceCollection services)
        {
            services.AddDbContext<ApplicationDbContext>(options => options.UseSqlite(Configuration["Data:StoreProducts:ConnectionString"]));
            services.AddTransient<IProductRepository, EFProductRepository>();
            services.AddScoped<Cart>(sp => SessionCart.GetCart(sp));
            services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
            services.AddMvc();
            services.AddMemoryCache();
            services.AddSession();
        }

        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            app.UseDeveloperExceptionPage();
            app.UseStatusCodePages();
            app.UseStaticFiles();
            app.UseSession();
            app.UseMvc(routes=>
            {
                routes.MapRoute(
                    name:null,
                    template:"{category}/Page{page:int}",
                    defaults:new {controller="Product", action="List"}
                );

                routes.MapRoute(
                    name:null,
                    template:"Page{page:int}",
                    defaults:new {controller="Product", action="List", page = 1}
                );

                routes.MapRoute(
                    name:null,
                    template:"{category}",
                    defaults:new {controller="Product", action="List", page = 1}
                );

                routes.MapRoute(
                    name:null,
                    template: "",
                    defaults:new {controller="Product", action="List", page = 1}
                );

                routes.MapRoute(
                    name: null,
                    template: "{controller}/{action}/{id?}"
                );
               
            });

            
            SeedData.EnsurePopulated(app);
        }
    }
}


По умолчанию у нас отображается Product\List, который формируется из частичных представлений (@Html.Partial) _ProductSummary. _ProdictSummary содержит разные данные товара и форму с кнопкой "Добавить". При нажатии на кнопку "Добавить" должен сформироваться POST-запрос, который в итоге должен запустить метод действия AddToCart контроллера корзины Cart, который добавит товар в список покупок и отобразит представление корзины.

По факту кнопка "Добавить" не работает. Увидел, что в HTML Product\List в форме не отрабатывают TagHelper`ы. Т.е. где вместо asp-action="AddToCart" должно появиться action=/Cart/AddToCart по прежнему остаются asp-action="AddToCart". И другие asp-ххх (asp-controller и asp-for) тоже не "разворачиваются". По крайней мере, я понял, что они должны так работать.

Почему не работают TagHelper`ы? Как исправить?
  • Вопрос задан
  • 212 просмотров
Подписаться 1 Средний 3 комментария
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы