Изучаю 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>
_ViewImports.cshtml@using Store.Models
@using Store.Models.ViewModels
@using Store.Infrastructure
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
@addTagHelper Store.Infrastructure.*, Store
Startup.csusing 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`ы? Как исправить?