Em đang nghiên cứu cách để chuyển các parameter thành slug khi hiển thị. Ví dụ, nếu truy cập
localhost:44368/bai-viet/1
thì em muốn chuyển nó thành
localhost:44368/bai-viet/day-la-tieu-de-bai-viet
Em có tham khảo theo bài viết này link.
Tuy nhiên trong class SlugToIdAttribute thì nó báo là không có ActionParameters trong ActionExecutingContext. Giờ mà em muốn replace id thành slug thì phải sửa thế nào ạ Em xài asp.net core 3.1
SlugToIdAttribute.cs
public class SlugToIdAttribute : ActionFilterAttribute
{
private AppDbContext _dbContext;
public SlugToIdAttribute(AppDbContext dbContext)
{
_dbContext = dbContext;
}
public override void OnActionExecuting(ActionExecutingContext context)
{
var id = Convert.ToInt32(context.RouteData.Values["id"]);
var query = _dbContext.PostEntities.First(x => x.Id == id);
// lỗi ở đây
context.ActionParameters["slug"] = Slugify.GenerateSlug(query.Title);
base.OnActionExecuting(context);
}
}
Controller.cs
[ServiceFilter(typeof(SlugToIdAttribute))]
[Route("{id:int}")]
public IActionResult Post(int id)
{
var query = (from a in _dbContext.PostEntities
join b in _dbContext.CategoryBlogEntities on a.CategoryId equals b.Id
join e in _dbContext.AccountManagerEntities on a.CreatedBy equals e.Account
join f in _dbContext.AccountImageEntities on e.Account equals f.Account
join g in _dbContext.FileManageEntities on f.FileId equals g.Id
join h in _dbContext.UserEntities on e.Account equals h.Account
where a.IsDeleted == false && a.Id == id
where f.IsAvatar == true
select new PostDetailModel()
{
Id = a.Id,
Title = a.Title,
Slug = Slugify.GenerateSlug(a.Title),
AuthorName = h.FirstName + " " + h.LastName,
CreatedDate = a.CreatedDate,
Description = a.Description,
Content = a.Content,
AuthorRole = e.Role,
Category = b.Name,
Avatar = g.FilePath
}).First();
var tags = (from x in _dbContext.PostTagEntities
join y in _dbContext.TagEntities on x.TagId equals y.Id
where x.PostId == id
select y.Name).ToList();
query.Tag = tags;
return View(query);
}
Startup.cs
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "Admin",
pattern: "{area:exists}/{controller=Home}/{action=Index}/{id?}");
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
});