Javascript MVC AJAX调用url格式
我正在开发一个小型MVC5应用程序,它有一些视图和javascript文件 项目结构非常标准,即控制器、视图、脚本等的正常布局,但在部署到客户机系统时,脚本中的AJAX调用存在问题,应用程序部署在虚拟目录中,例如Javascript MVC AJAX调用url格式,javascript,jquery,ajax,asp.net-mvc,Javascript,Jquery,Ajax,Asp.net Mvc,我正在开发一个小型MVC5应用程序,它有一些视图和javascript文件 项目结构非常标准,即控制器、视图、脚本等的正常布局,但在部署到客户机系统时,脚本中的AJAX调用存在问题,应用程序部署在虚拟目录中,例如http://host/application/ 这个问题是由jqueryajax调用的url参数未一致解析引起的。例如,一个脚本对以下内容感到满意: $.ajax({ url: 'controller/action' ....}); 而另一个需要 $.ajax({url: '../c
http://host/application/
这个问题是由jqueryajax调用的url参数未一致解析引起的。例如,一个脚本对以下内容感到满意:
$.ajax({ url: 'controller/action' ....});
而另一个需要
$.ajax({url: '../controller/action' ....});
$.ajax({url: '../action' ....});
最近,另一项要求
$.ajax({url: '../controller/action' ....});
$.ajax({url: '../action' ....});
我看不出我对这些脚本(或控制器或视图)做了什么不同的事情,那么为什么URL的生成方式不同呢
我现在可以解决这个问题,但我想了解问题的原因,这样以后就不会陷入混乱。我建议您为javascript服务器端生成URL(如果您的应用程序作为子应用程序或类似的应用程序托管在IIS中,这些URL可能会更改)。一个非常有用的工具是T4MVC。通过nuget添加它。检查一下 您只需保存T4,它将生成强类型操作(以及许多其他整洁的东西) 或者,您可以安装一个VisualStudio扩展,它会自动为您执行此操作。它被称为 然后,您要做的是在razor中创建javascript对象并生成所有URL。因此,如果更改控制器或操作,则会出现编译时错误
var myUrls = {
get: '@Url.Action(MVC.MyController.Get())',
add: '@Url.Action(MVC.MyController.Add())'
}
然后像这样使用它:
$.ajax({url: myUrls.get});
所有的url问题都解决了=)我建议您为javascript服务器端生成url(如果您的应用程序作为子应用程序或类似应用程序托管在IIS中,这些url可能会发生变化)。一个非常有用的工具是T4MVC。通过nuget添加它。检查一下 您只需保存T4,它将生成强类型操作(以及许多其他整洁的东西) 或者,您可以安装一个VisualStudio扩展,它会自动为您执行此操作。它被称为 然后,您要做的是在razor中创建javascript对象并生成所有URL。因此,如果更改控制器或操作,则会出现编译时错误
var myUrls = {
get: '@Url.Action(MVC.MyController.Get())',
add: '@Url.Action(MVC.MyController.Add())'
}
然后像这样使用它:
$.ajax({url: myUrls.get});
所有的url问题都解决了=)我建议您为javascript服务器端生成url(如果您的应用程序作为子应用程序或类似应用程序托管在IIS中,这些url可能会发生变化)。一个非常有用的工具是T4MVC。通过nuget添加它。检查一下 您只需保存T4,它将生成强类型操作(以及许多其他整洁的东西) 或者,您可以安装一个VisualStudio扩展,它会自动为您执行此操作。它被称为 然后,您要做的是在razor中创建javascript对象并生成所有URL。因此,如果更改控制器或操作,则会出现编译时错误
var myUrls = {
get: '@Url.Action(MVC.MyController.Get())',
add: '@Url.Action(MVC.MyController.Add())'
}
然后像这样使用它:
$.ajax({url: myUrls.get});
所有的url问题都解决了=)我建议您为javascript服务器端生成url(如果您的应用程序作为子应用程序或类似应用程序托管在IIS中,这些url可能会发生变化)。一个非常有用的工具是T4MVC。通过nuget添加它。检查一下 您只需保存T4,它将生成强类型操作(以及许多其他整洁的东西) 或者,您可以安装一个VisualStudio扩展,它会自动为您执行此操作。它被称为 然后,您要做的是在razor中创建javascript对象并生成所有URL。因此,如果更改控制器或操作,则会出现编译时错误
var myUrls = {
get: '@Url.Action(MVC.MyController.Get())',
add: '@Url.Action(MVC.MyController.Add())'
}
然后像这样使用它:
$.ajax({url: myUrls.get});
你所有的url问题都解决了=)这里的主要问题是人们建议使用@url.Action和@Html.ActionLink这样的东西,它们永远都不会起作用 原因是正如OP所说,javascript保存在.js文件中。IIS将通过StaticFileHandler提供.js文件,除非您使用的是web.config文件定义的其他处理程序。开箱即用的SFH不存在于MVC的执行链中,它不用于提供动态内容,因此得名。因此,您不能将MVC@指令或调用放入javascript文件或css文件中。css中的@是合法的,将由MVC/ASP.NET堆栈处理,但不会由MVC/ASP.NET堆栈处理 T4MVC-很好的工具,但对于这个问题来说可能有些过头了 回到OP,这里的模式是什么?使用$.ajax(…)语法的调用不需要对url参数进行任何操作。这样做会破坏脚本的可缓存性。需要修改的不是脚本本身 当我遇到这样的问题时,我倾向于问自己几个问题: 所有这些脚本都在同一目录中吗 它们都是从相同的MVC视图路径结构调用的吗?或者某些视图比其他视图更嵌套 根据包含在部分视图或“完整”视图中的脚本,行为是否有所不同
其中一个通常会指出问题所在,但如果由于迫在眉睫的截止日期而没有时间,我通常会选择在.js文件中使用指向所需端点的路径,使用IIS能够解决的格式。您硬编码了“/Letter/GetRecpient”,那么为什么不硬编码“~/Letter/GetRecipient”?使用“~”表示IIS正确解析url,即使文件是通过SFH提供的;) 这里的主要问题是,人们建议使用@Url.Action和@Html.ActionLink这样的东西,但这些东西永远不会起作用 原因是正如OP所说,javascript保存在.js文件中。IIS将通过StaticFileHandler提供.js文件,除非您使用的是web.config文件定义的其他处理程序。开箱即用的SFH不存在于MVC的执行链中,它不用于提供动态内容,因此得名。因此,您不能将MVC@指令或调用放入javascript文件或css文件中。css中的@是合法的,将由MVC/ASP.NET堆栈处理,但不会由MVC/ASP.NET堆栈处理 T4MVC-很好