Работа над маршрутизацией

This commit is contained in:
2025-10-06 17:50:53 +04:00
parent 94c9ce1264
commit fd80bdc93e
7 changed files with 99 additions and 32 deletions
+2 -1
View File
@@ -215,9 +215,10 @@ public class EntitySerializer
{
var entity = (IEntity)value;
var entityType = entity.Entity.Type;
var typeName = PgNameHelper.GetPgName(entityType);
var slug = entity.Entity.Slug;
var name = entity.Entity.Name[LocaleType.English];
return ($"<a href=\"/Entity/{entityType}/{slug}\">{name}</a>", true);
return ($"<a href=\"/{typeName}/{slug}\">{name}</a>", true);
}
// Обработка коллекций
+17
View File
@@ -0,0 +1,17 @@
using System;
using System.Reflection;
using NpgsqlTypes;
using Pf2e.Database.Model.Enum;
namespace Pf2e.Web.Helpers
{
public static class PgNameHelper
{
public static string GetPgName(EntityType entityType)
{
var fieldInfo = entityType.GetType().GetField(entityType.ToString());
var pgNameAttribute = fieldInfo?.GetCustomAttribute<PgNameAttribute>();
return pgNameAttribute?.PgName ?? entityType.ToString().ToLower();
}
}
}
+1 -1
View File
@@ -1,4 +1,4 @@
@page
@page "{type}/{slug}"
@model Pf2e.Web.Pages.EntityModel
@{
+34 -18
View File
@@ -15,6 +15,7 @@ using Pf2e.Web.Helpers;
namespace Pf2e.Web.Pages
{
[ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
public class EntityModel(Pf2eDbContext context) : PageModel
{
private readonly Pf2eDbContext _context = context;
@@ -24,27 +25,42 @@ namespace Pf2e.Web.Pages
public IActionResult OnGet(string type, string slug)
{
// Получаем тип сущности
EntityType entityType = EntityTypeModel.Enum<EntityType>(type);
// Находим сущность по slug и типу
Entity? entity = _context.Entities.FirstOrDefault(e =>
e.Slug == slug && e.Type == entityType
);
if (entity == null)
// Добавим отладочную информацию
System.Diagnostics.Debug.WriteLine($"EntityModel.OnGet called with type: {type}, slug: {slug}");
try
{
// Получаем тип сущности
EntityType entityType = EntityTypeModel.Enum<EntityType>(type);
System.Diagnostics.Debug.WriteLine($"EntityType resolved to: {entityType}");
// Находим сущность по slug и типу
Entity? entity = _context.Entities.FirstOrDefault(e =>
e.Slug.ToLower() == slug.ToLower() && e.Type == entityType
);
if (entity == null)
{
System.Diagnostics.Debug.WriteLine($"Entity not found: type={entityType}, slug={slug}");
return NotFound();
}
System.Diagnostics.Debug.WriteLine($"Entity found: {entity.Id} - {entity.Name[Pf2e.Database.Model.Common.I18n.LocaleType.English]}");
// Создаём FullEntity
FullEntity = new(_context, entity);
// Сериализуем для отображения
EntitySerializer serializer = new();
SerializationResult = serializer.Serialize(FullEntity);
return Page();
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine($"Error in EntityModel.OnGet: {ex.Message}");
return NotFound();
}
// Создаём FullEntity
FullEntity = new(_context, entity);
// Сериализуем для отображения
EntitySerializer serializer = new();
SerializationResult = serializer.Serialize(FullEntity);
return Page();
}
}
}
+13 -7
View File
@@ -1,4 +1,4 @@
@page
@page "/{type}"
@using Pf2e.Database.Model.Common.I18n
@model EntityTypeModel
@@ -45,7 +45,10 @@
@Html.DisplayFor(modelItem => item.Id)
</td>
<td>
<a asp-page="./Entity" asp-route-type="@item.Type" asp-route-slug="@item.Slug">
@{
var typeName = Pf2e.Web.Helpers.PgNameHelper.GetPgName(item.Type);
}
<a href="/@typeName/@item.Slug">
@Html.DisplayFor(modelItem => item.Name[LocaleType.English])
</a>
</td>
@@ -75,14 +78,17 @@
<nav aria-label="Page navigation example">
<ul class="pagination">
<li class="page-item @(Model.CurrentPage == 1 ? "disabled" : "")">
<a class="page-link" asp-page="./EntityType" asp-route-type="@Model.CurrentType" asp-route-pageNum="@(Model.CurrentPage - 1)">Previous</a>
@{
var currentTypeName = Pf2e.Web.Helpers.PgNameHelper.GetPgName(Model.CurrentType);
}
<a class="page-link" href="/@currentTypeName?pageNum=@(Model.CurrentPage - 1)">Previous</a>
</li>
@foreach (var num in Model.Pagination)
{
@if (num == Model.CurrentPage)
{
<li class="page-item active">
<a class="page-link" asp-page="./EntityType" asp-route-type="@Model.CurrentType" asp-route-pageNum="@(num)">@num</a>
<a class="page-link" href="/@currentTypeName?pageNum=@(num)">@num</a>
</li>
}
else if (num == -1)
@@ -94,12 +100,12 @@
else
{
<li class="page-item">
<a class="page-link" asp-page="./EntityType" asp-route-type="@Model.CurrentType" asp-route-pageNum="@(num)">@num</a>
<a class="page-link" href="/@currentTypeName?pageNum=@(num)">@num</a>
</li>
}
}
<li class="page-item @(Model.CurrentPage == Model.LastPage ? "disabled" : "")">
<a class="page-link" asp-page="./EntityType" asp-route-type="@Model.CurrentType" asp-route-pageNum="@(Model.CurrentPage + 1)">Next</a>
<a class="page-link" href="/@currentTypeName?pageNum=@(Model.CurrentPage + 1)">Next</a>
</li>
</ul>
</nav>
</nav>
+27 -3
View File
@@ -10,8 +10,11 @@ using Pf2e.Database;
using Pf2e.Database.Model.Base;
using Pf2e.Database.Model.Enum;
using Microsoft.AspNetCore.Mvc.RazorPages;
namespace Pf2e.Web.Pages
{
[ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
public class EntityTypeModel : PageModel
{
private readonly Pf2eDbContext _context;
@@ -22,7 +25,7 @@ namespace Pf2e.Web.Pages
}
[BindProperty(SupportsGet = true)]
public int? PageNum { get; set; }
public int? PageNum { get; set; } = 1;
public IList<Entity> Entity { get; set; } = default!;
@@ -34,11 +37,24 @@ namespace Pf2e.Web.Pages
public const int PerPage = 30;
public void OnGet(string type)
public IActionResult OnGet(string type)
{
CurrentType = Enum<EntityType>(type);
// Добавим отладочную информацию
System.Diagnostics.Debug.WriteLine($"EntityTypeModel.OnGet called with type: {type}");
try
{
CurrentType = Enum<EntityType>(type);
System.Diagnostics.Debug.WriteLine($"CurrentType resolved to: {CurrentType}");
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine($"Error resolving enum: {ex.Message}");
return NotFound();
}
int count = _context.Entities.Count(entity => entity.Type == CurrentType);
System.Diagnostics.Debug.WriteLine($"Count for {CurrentType}: {count}");
LastPage = (int)Math.Ceiling(count / (double)PerPage);
@@ -47,6 +63,9 @@ namespace Pf2e.Web.Pages
.Skip((CurrentPage - 1) * PerPage)
.Take(PerPage)
.ToList();
System.Diagnostics.Debug.WriteLine($"Returning page with {Entity.Count} entities");
return Page();
}
/// <summary>
@@ -57,6 +76,8 @@ namespace Pf2e.Web.Pages
public static T Enum<T>(string value)
where T : Enum
{
System.Diagnostics.Debug.WriteLine($"Trying to resolve enum value: {value} for type {typeof(T)}");
foreach (System.Reflection.FieldInfo field in typeof(T).GetFields())
{
List<string> variants = [field.Name];
@@ -69,8 +90,11 @@ namespace Pf2e.Web.Pages
variants.Add(pgAttribute.PgName);
}
System.Diagnostics.Debug.WriteLine($"Checking field: {field.Name}, variants: {string.Join(", ", variants)}");
if (variants.Contains(value))
{
System.Diagnostics.Debug.WriteLine($"Matched field: {field.Name}");
return (T)field.GetValue(null)!;
}
}
+5 -2
View File
@@ -21,7 +21,10 @@
{
<tr>
<td>
<a asp-page="./EntityType" asp-route-type="@row.Key">
@{
var typeName = Pf2e.Web.Helpers.PgNameHelper.GetPgName(row.Key);
}
<a href="/@typeName">
@row.Key
</a>
</td>
@@ -29,4 +32,4 @@
</tr>
}
</tbody>
</table>
</table>