ASP.NET Core:如何从cshtml页面内的按钮跳转至指定html/cshtml页面并解决静态资源引用问题
我来帮你拆解问题,分两部分解决:一是Pages目录下Razor页面的跳转问题,二是wwwroot中静态HTML的资源加载问题,都是ASP.NET Razor Pages里常见的路由和资源引用误区。
一、修复Pages目录下Razor页面的跳转
首先要明确:Razor Pages(.cshtml文件)不是静态文件,不能通过文件路径直接访问,它是由ASP.NET路由系统处理的,跳转时必须用路由路径,不是文件路径。
你有两种靠谱的解决方式:
1. 推荐使用ASP.NET标签助手(最稳妥)
用asp-page标签助手可以自动生成正确的路由路径,适配部署环境的变化,不用手动写路径。修改你的按钮代码:
<button type="button" class="create_but"> <a asp-page="./createCampaign">Create Campaign</a> </button>
./createCampaign是相对当前页面(Index.cshtml在Pages根目录)的路由,对应Pages/createCampaign.cshtml文件;- 如果目标页面在Pages的子目录(比如
Pages/Campaigns/addCampaign.cshtml),就写./Campaigns/addCampaign或者绝对路由/Campaigns/addCampaign。
2. 直接写绝对路由路径
如果不想用标签助手,直接写根路径开头的路由(Razor Pages默认路由是页面文件名去掉.cshtml):
<button type="button" class="create_but"> <a href="/createCampaign">Create Campaign</a> </button>
这种方式也能正确跳转,因为路由系统会匹配到Pages/createCampaign.cshtml页面。
为什么之前的../Pages/createCampaign.cshtml不行?因为服务器会把它当成静态文件请求,而Razor Pages需要经过路由解析、执行页面逻辑后才返回HTML,直接访问文件路径会被拒绝或者返回原始cshtml代码。
二、修复wwwroot中静态HTML的资源加载问题
wwwroot里的静态HTML文件不能用~/css/xxx.css这种路径——~是ASP.NET Razor视图特有的路径符号,静态HTML里服务器不会解析它,浏览器会把~/当成路径的一部分,导致找不到资源。
正确做法是用根相对路径(以/开头),让浏览器从网站根目录开始查找资源:
<!-- 错误写法 --> <link rel="stylesheet" href="~/css/style.css"> <script src="~/js/script.js"></script> <!-- 正确写法 --> <link rel="stylesheet" href="/css/style.css"> <script src="/js/script.js"></script>
不管你的静态HTML在wwwroot的哪个子目录(比如html/insertCampaign.html),这种写法都能正确加载根目录下css和js文件夹里的资源。
三、最佳实践建议
- 优先用Razor Pages(.cshtml)来做业务页面:它能完美集成ASP.NET的路由、模型绑定等功能,静态资源引用直接用
~/就可以,维护起来更统一; - 静态HTML只用于纯静态内容:如果必须用,所有资源引用都用根相对路径,避免层级变化导致的路径错误;
- 跳转Razor Pages时优先用
asp-page标签助手:后续如果修改页面路由(比如在@page指令里自定义路由),标签助手会自动更新跳转路径,不用手动修改。
内容的提问来源于stack exchange,提问作者Sara Briccoli




