2014-10-28 78 views
0

我正在研究一个小MVC 5应用程序,它有少量的视图和JavaScript文件。MVC AJAX调用url格式

项目结构是非常标准的,也就是控制器,视图,脚本等的正常布局,但我在部署到客户端系统时遇到了脚本中的AJAX调用问题 - 应用程序部署在虚拟目录,例如http://host/application/

该问题是由jquery ajax调用的url参数不能一致解析引起的。例如,一个脚本是高兴:

$.ajax({ url: 'controller/action' ....}); 

而另一个需要

$.ajax({url: '../controller/action' ....}); 

,最近另一个需要

$.ajax({url: '../action' ....}); 

我看不到,我已经做不同的事情对于这些脚本(或控制器或视图),为什么这些URL会以不同的方式生成?

我现在可以解决这个问题,但想了解问题的原因,所以我以后不会陷入混乱。

+2

您是如何生成网址的?我假设通过'@ Url.Action()'?如果是这样,请检查您在Global.asax/RouteConfig.cs中设置的路线 – 2014-10-28 10:09:16

+0

脚本不在视图中,而是在单独的文件中,并通过“部分”注入到视图中。脚本只有实际的控制器和操作,例如$阿贾克斯(网址:{url: '/信/ GetRecipient' .....}); – DilbertDave 2014-10-28 10:16:04

+0

这不会真的听起来像mvc - 我已经使用它几个月了,并已使用最小的ajax。你能发布你的Maproute的内容吗? (在RouteConfig.cs中找到)。正如@RoryMcCrossan所说的,使用'@ Url.Action'或'@ Html.ActionLink'可能是你想要的 – 2014-10-28 10:17:47

回答

1

我建议您为您的JavaScript服务器端生成url(如果您的应用程序作为子应用程序或类似的东西托管在IIS中,这些可以更改)。一个非常有用的工具是T4MVC。通过nuget添加它。检查它here.

你只需保存T4,它会生成强类型的动作(以及许多其他整洁的东西)。

或者您可以安装一个可自动为您安装的Visual Studio扩展。它被称为autoT4MVC

然后你做什么,是在剃刀中创建JavaScript对象,并生成所有的URL。所以如果你改变你的控制器或动作,你将会有编译时错误。

var myUrls = { 
    get: '@Url.Action(MVC.MyController.Get())', 
    add: '@Url.Action(MVC.MyController.Add())' 
} 

然后使用它是这样的:

$.ajax({url: myUrls.get}); 

,您的所有网址的烦恼都解决了=)

+0

我过去使用过T4MVC,它非常有用 - 不记得在JavaScript文件中使用它,主要是操作链接等。该项目目前尚未实现,但它足够小,可以包括我想 - 但我想了解是什么导致这个问题,我不能做它的头或尾。 – DilbertDave 2014-10-28 10:26:14

1

这里的主要问题是,人们建议使用之类的东西@ Url.Action和@ Html.ActionLink这些都不会有用 - 永远。

原因是,正如OP所说,JavaScript保存在.js文件中。 IIS将通过StaticFileHandler提供.js文件,除非您使用由web.config文件定义的其他处理程序。开箱即用的SFH并不生活在MVC的执行链中,它不是用于提供动态内容,因此它的名称。因此,您不能在JavaScript文件或css文件中放入MVC @指令或调用。 css中的@是合法的,将被处理,但不会被MVC/ASP.NET堆栈处理。

T4MVC - 很好的工具,但可能矫枉过正这个问题。

回到OP,这是什么模式?使用$ .ajax(...)语法的调用不需要任何对url参数的操作。这样做会破坏脚本的缓存能力。这不是脚本本身需要修复。

当我遇到这样的问题时,我倾向于问自己几个问题: 所有这些脚本都在同一个目录中吗?

它们是否都从相同的MVC视图路径结构调用?还是有些视图比其他视图更嵌套?

取决于包含在部分或“完整”视图中的脚本,行为是否有所不同?

其中之一通常会标记问题,但如果由于迫近的截止日期而没有时间,我通常会选择使用IIS中能够解析的格式在我的.js文件中使用所需端点的路径。你硬编码“/ Letter/GetRecpient”,为什么不硬编码“〜/ Letter/GetRecipient”?使用“〜”意味着即使通过SFH提供文件,IIS也能正确解析url;)

+0

脚本位于主脚本文件夹内的“控制器特定”文件夹内,即脚本/字母或脚本/标签 - 我以前没有做过任何事情。使用“〜”似乎也达不到预期效果 - 代字符实际上是作为url的一部分呈现出来的。 – DilbertDave 2014-10-30 09:13:39

+0

哦,这些都是'全'观点 - 不是偏见。 – DilbertDave 2014-10-30 09:17:46

1

那么如果将此解决方案部署到本地IIS并完全控制,会发生什么?尝试将其部署到虚拟目录并将其部署到根目录并查看会发生什么。有一点IIS错误配置有关你的问题的气味。

+0

我很确定客户和我的开发IIS是香草,但你永远不知道。我会花一些时间做一些有条不紊的测试。 – DilbertDave 2014-10-30 18:26:44