Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript MVC AJAX调用url格式_Javascript_Jquery_Ajax_Asp.net Mvc - Fatal编程技术网

Javascript MVC AJAX调用url格式

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

我正在开发一个小型MVC5应用程序,它有一些视图和javascript文件

项目结构非常标准,即控制器、视图、脚本等的正常布局,但在部署到客户机系统时,脚本中的AJAX调用存在问题,应用程序部署在虚拟目录中,例如
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-很好