从除Index.cshtml之外的MVC Razor视图调用时,Ajax调用失败

时间:2014-08-07 19:51:33

标签: c# javascript ajax asp.net-mvc asp.net-mvc-4

我很困惑为什么我的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

奇怪的是,同一个呼叫在一个页面上起作用,而在另一个页面上起作用。我的问题:

  1. 有人可以解释为什么会这样吗?
  2. 有什么补救措施吗?
  3. 另外,请注意我已经阅读了一些关于从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/IndexHome/Details时,此行为不会发生。我注意到Ajax调用在AnyController/Index页面上工作正常,但在从AnyController/AnyOtherPage调用时失败。

1 个答案:

答案 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 /仍然有效。有关详细信息,必须显示为主页/详细信息。