我很困惑为什么我的Ajax调用在从Index视图调用时成功,但在从具有不同名称的视图调用时失败。我有一个ASP .NET MVC 4项目,它也涉及一些通过Javascript的Ajax请求。我的这个页面的Javascript / JQuery代码非常复杂,我已经将它们写在一个单独的Javascript文件中。这是我的一个Javascript文件的简化摘录,我在其中发出Ajax请求:
//to be called in the JQuery page load function
function initialize(){
$.ajax({ url: MyController/GetData, async: false })
.done(function(returnedData) {
doStuff(returnedData);
});
}
在我的家庭控制器中,我使用默认名称Index.cshtml
创建了一个新视图。在这个视图中,我引用了包含上述函数的外部Javascript文件。当我打开/Home
页面(Home/Index
因为我有默认路由设置)时,会调用initialize()
函数并按预期 Ajax调用成功。
我创建了另一个名为Details.cshtml
的视图,在此页面中,我也引用了相同的Javascript文件。当我打开/Home/Details
页面时,会调用initialize()
函数, Ajax调用失败。错误消息显示它正在寻找肯定不存在的/Home/Details/MyController/GetData
。
奇怪的是,同一个呼叫在一个页面上起作用,而在另一个页面上起作用。我的问题:
另外,请注意我已经阅读了一些关于从MVC Razor视图调用Ajax的问题,他们经常建议您使用Url.Action(...)
来创建URL。问题是,在这种情况下,这不是我的选择,因为我真的想将我的Javascript与我的Razor View分开。另外,如果这是一个阻碍,为什么它从索引页面调用时会起作用?
感谢您的帮助。
更新 这是RouteConfig文件:
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.IgnoreRoute("favicon.ico");
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults:new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
}
注意:当我在Home/Index
或Home/Details
时,此行为不会发生。我注意到Ajax调用在AnyController/Index
页面上工作正常,但在从AnyController/AnyOtherPage
调用时失败。
答案 0 :(得分:2)
这取决于你的路由,但试试这个(在MyController前放一个斜杠):
function initialize(){
$.ajax({ url: /MyController/GetData, async: false })
.done(function(returnedData) {
doStuff(returnedData);
});
}
它还可以帮助指定它是get还是post,以及您希望它发送的数据类型。 Mv对Json很好:
function initialize(){
$.ajax({ url: /MyController/GetData, async: false, dataType:"json", type:"Get" })
.done(function(returnedData) {
doStuff(returnedData);
});
}
它在索引页面上工作的原因可能是因为细节必须显示在URL中,但索引不会。因此,如果您的索引网址是Home / Index,Home /仍然有效。有关详细信息,必须显示为主页/详细信息。