You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将ASP.NET Core Razor Pages文章URL优化为友好格式?

问题描述

目前我的文章URL格式如下:

http://localhost:5153/Content/Article?title=The%20Statistic%20Article

但我希望它们变为如下格式:

http://localhost:5153/Content/Article/the-statistic-article 或 http://localhost:5153/Content/the-statistic-article

文章内容存储在Article.cshtml中。

现有页面模型代码:

public async Task<IActionResult> OnGetArticleAsync(int id)
{
    Article = await _context.Articles
                            .FirstOrDefaultAsync(m => m.Id == id);

    if (Article == null)
    {
        return NotFound();
    }
        
    return new JsonResult(new { redirectToUrl = Url.Page("Article", new { title = Article.Title }), articleData = Article });
}

AJAX代码:

$.ajax({
        url: 'Article?handler=Article',
        type: 'GET',
        data: { id: id }, 
        success: function (response) {
            if (response.redirectToUrl) {

                localStorage.setItem('articleData', JSON.stringify(response.articleData));
                window.location.href = response.redirectToUrl;
            }
        },

        error: function (xhr, status, error) {
            // Handle errors here
            console.error(error);
        }
    });
实现步骤

1. 配置友好路由

先在项目的路由配置里添加规则,让系统能识别slug格式的URL:

.NET 6+(Program.cs)

app.MapRazorPages();
// 匹配 /Content/Article/xxx 格式
app.MapRazorPage("/Content/Article/{slug}", "/Content/Article");
// 如果要实现 /Content/xxx 格式,再加这条
app.MapRazorPage("/Content/{slug}", "/Content/Article");

.NET 5及更早(Startup.cs)

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    // ...其他中间件代码
    app.UseEndpoints(endpoints =>
    {
        endpoints.MapRazorPages();
        // 添加自定义路由规则
        endpoints.MapRazorPage("/Content/Article/{slug}", "/Content/Article");
        endpoints.MapRazorPage("/Content/{slug}", "/Content/Article");
    });
}

2. 给文章添加Slug字段并生成值

给Article实体新增Slug字段,用来存储格式化后的标题(比如the-statistic-article)。可以写个工具方法生成Slug,在创建文章时存入数据库:

生成Slug的工具方法

public static string GenerateSlug(string title)
{
    // 转小写、空格替换为连字符、清除特殊字符
    return title.ToLowerInvariant()
                .Replace(" ", "-")
                .Replace("[^a-z0-9-]", "");
}

创建文章时调用:

article.Slug = GenerateSlug(article.Title);
_context.Articles.Add(article);
await _context.SaveChangesAsync();

3. 修改页面模型逻辑

调整页面模型代码,让它支持通过Slug查询文章,同时修改重定向URL的生成逻辑:

// 处理带slug的URL请求
public async Task<IActionResult> OnGetAsync(string slug)
{
    Article = await _context.Articles
                            .FirstOrDefaultAsync(m => m.Slug == slug);

    if (Article == null)
    {
        return NotFound();
    }
        
    return Page();
}

// 保留原有的根据ID获取的接口,供AJAX调用
public async Task<IActionResult> OnGetArticleAsync(int id)
{
    Article = await _context.Articles
                            .FirstOrDefaultAsync(m => m.Id == id);

    if (Article == null)
    {
        return NotFound();
    }
    
    // 生成slug
    var slug = GenerateSlug(Article.Title);
    // 生成目标格式的URL,二选一即可
    var redirectUrl = Url.Page("Article", new { slug = slug });
    // 如果要/Content/{slug}格式,用这个:
    // var redirectUrl = Url.Page("/Content/Article", new { slug = slug }, protocol: Request.Scheme);
    
    return new JsonResult(new { redirectToUrl = redirectUrl, articleData = Article });
}

4. 调整Article页面的路由指令

在Article.cshtml顶部添加以下路由指令,让页面能匹配不同的URL格式:

@page "/Content/Article"
@page "/Content/Article/{slug}"
@page "/Content/{slug}"
@model YourNamespace.Content.ArticleModel

完成以上配置后,AJAX请求后重定向的URL就会变成你想要的slug格式了。

内容的提问来源于stack exchange,提问作者Mehmet Ali K.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 16:34:58