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

.NET Core 6如何创建包含连字符的动态路由

.NET Core 6 实现带连字符的动态岗位路由方案

.NET Core 6 原生支持路由段内固定文本与参数拼接,不需要额外引入第三方库、也不需要手动拆分URL字符串,按以下步骤配置即可。

一、后端路由配置

根据你用的项目类型选对应配置即可:

  • MVC 项目配置
    在Program.cs中添加对应路由规则,直接把固定前缀hiring-和路由参数position写在同一段模板里:

    var builder = WebApplication.CreateBuilder(args);
    builder.Services.AddControllersWithViews();
    var app = builder.Build();
    
    // 其他中间件配置...
    app.UseStaticFiles();
    app.UseRouting();
    
    // 招聘岗位动态路由,放在默认路由之前
    app.MapControllerRoute(
        name: "hiring_position",
        pattern: "career/hiring-{position}",
        defaults: new { controller = "Career", action = "PositionDetail" }
    );
    
    // 默认路由配置
    app.MapControllerRoute(
        name: "default",
        pattern: "{controller=Home}/{action=Index}/{id?}");
    
    app.Run();
    

    对应控制器接收参数即可,框架会自动把hiring-后面的内容绑定到position参数:

    public class CareerController : Controller
    {
        public IActionResult PositionDetail(string position)
        {
            // 岗位白名单校验,非法值直接返回404
            string[] validPositions = { "react", ".net", "flutter" };
            if (!validPositions.Contains(position.ToLower()))
                return NotFound();
            
            // 传递岗位数据到视图渲染
            return View(model: position);
        }
    }
    
  • Razor Pages 项目配置
    不需要在Program.cs额外写路由规则,直接在岗位详情页的@page指令中声明路由模板即可:

    @page "/career/hiring-{position}"
    @model YourApp.Pages.Career.PositionDetailModel
    

    对应PageModel中直接绑定参数:

    public class PositionDetailModel : PageModel
    {
        public void OnGet(string position)
        {
            // 同MVC的参数校验、数据查询逻辑
        }
    }
    

注意:不要把整个hiring-xxx作为一个路由参数再做字符串拆分,这种写法冗余且容易出错,框架自带的段内文本拼接能力完全可以满足需求,连字符、点号这类特殊字符在非文件路径段中不需要额外转义。

二、前端点击切换URL逻辑

点击岗位选项时直接拼接目标路径即可,根据你的需求选择整页跳转或者SPA无刷新跳转:

<!-- 岗位选项示例 -->
<div class="position-tabs">
  <button class="tab-btn" data-pos="react">React 招聘</button>
  <button class="tab-btn" data-pos=".net">.NET 招聘</button>
  <button class="tab-btn" data-pos="flutter">Flutter 招聘</button>
</div>

<script>
const tabBtns = document.querySelectorAll('.tab-btn');
tabBtns.forEach(btn => {
  btn.addEventListener('click', (e) => {
    const targetPos = e.target.dataset.pos;
    const targetUrl = `/career/hiring-${targetPos}`;
    
    // 整页刷新跳转用这个
    window.location.href = targetUrl;

    // 如果是单页应用不需要刷新,用history改URL再局部刷新内容即可
    // history.pushState(null, '', targetUrl);
    // loadPositionContent(targetPos);
  })
})
</script>

常见踩坑点:如果开启了静态文件中间件,确保路由配置写在app.UseStaticFiles()之后、app.Run()之前,避免带点的路径(比如/career/hiring-.net)被误识别为静态文件请求返回404。

内容的提问来源于stack exchange,提问作者Kylie

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 22:48:22