部署后的MVC6项目中带QueryString的窗口跳转功能异常
解决MVC6部署IIS后新窗口404的优雅方案
这个问题我之前部署MVC项目时也踩过同款坑,核心原因是本地调试与IIS部署的站点根路径不一致:
- 本地Visual Studio调试时,你的应用直接运行在站点根目录,
/MyView/HandleButton能被MVC路由正确解析到控制器方法; - 部署到IIS作为子应用时,IIS会把不带应用名的绝对路径
/MyView/HandleButton当成物理文件路径去C:\inetpub\wwwroot下查找,自然找不到对应的资源,返回404。
你临时硬编码应用名的方式虽然能解决部署问题,但本地调试又会失效,确实不够优雅。这里有两种框架原生的解决方案,完美适配两种环境:
方案一:用Url.Action生成完整路由URL(推荐)
直接借助MVC的Url.Action方法生成正确的请求URL,它会自动根据当前环境(本地/子应用)拼接根路径。
修改父视图按钮代码:
@{ wButtonClass = "btn btn-warning openW"; var targetUrl = Url.Action("HandleButton", "MyView", new { id = id }); } <a href="javascript:void(0);" class="@wButtonClass" data-url="@targetUrl">@buttonText</a>
修改脚本代码:
$(document).ready(function () { $(".openW").click(function (e) { // 直接取预先生成好的完整URL var targetUrl = $(this).data("url"); var new_window = window.open(targetUrl, '_blank', 'left=200,top=150,width=1000,height=800,toolbar=1,resizable=0'); }); });
这样不管是本地调试还是IIS子应用部署,Url.Action都会生成对应环境的正确URL:
- 本地:
/MyView/HandleButton?id=5 - IIS子应用:
/MyWebApp/MyView/HandleButton?id=5
方案二:用Url.Content("~")获取站点根路径
如果不想修改按钮的属性,也可以在脚本中动态获取站点根路径,再拼接路由:
修改脚本代码:
$(document).ready(function () { // 借助Url.Content获取当前站点的根路径 var rootPath = '@Url.Content("~")'; $(".openW").click(function (e) { var x = $(this).data("id"); // 拼接成完整的请求URL var targetUrl = rootPath + 'MyView/HandleButton?id=' + x; var new_window = window.open(targetUrl, '_blank', 'left=200,top=150,width=1000,height=800,toolbar=1,resizable=0'); }); });
@Url.Content("~")会自动解析为:
- 本地调试时:
/ - IIS子应用部署时:
/MyWebApp/
两种方案都不需要手动切换环境,完全由MVC框架自动适配,比硬编码应用名优雅得多,且能保证本地和部署环境都正常运行。
内容的提问来源于stack exchange,提问作者Eck_FG
相关产品推荐
相关产品推荐

