【问题标题】:Ajax call fails when called from MVC Razor view other than Index.cshtml从 Index.cshtml 以外的 MVC Razor 视图调用 Ajax 调用失败
【发布时间】:2014-08-07 19:51:32
【问题描述】:

我很困惑为什么我的 Ajax 调用在从索引视图调用时成功但在从具有不同名称的视图调用时失败。我有一个 ASP .NET MVC 4 项目,它还涉及一些通过 Javascript 的 Ajax 请求。这个页面的 Javascript/JQuery 代码非常复杂,我将它们写在一个单独的 Javascript 文件中。这是我提出 Ajax 请求的一个 Javascript 文件的简化摘录:

//to be called in the JQuery page load function
function initialize(){
    $.ajax({ url: MyController/GetData, async: false })
        .done(function(returnedData) {
            doStuff(returnedData);
        });
}

在我的 Home 控制器中,我创建了一个默认名称为 Index.cshtml 的新视图。在这个视图中,我引用了包含上述函数的外部 Javascript 文件。当我打开我的/Home 页面(这是Home/Index,因为我有默认路由设置)时,initialize() 函数被调用并且 Ajax 调用成功 如预期。

我创建了另一个名为Details.cshtml 的视图,在此页面中,我还引用了相同的 Javascript 文件。当我打开我的/Home/Details 页面时,会调用initialize() 函数并且Ajax 调用失败。错误消息说它正在寻找绝对不存在的/Home/Details/MyController/GetData

奇怪的是,同样的调用在一个页面上有效,而在另一个页面上无效。我的问题:

  1. 有人可以解释为什么会发生这种情况吗?
  2. 有什么补救措施吗?

另外,请注意,我已经阅读了几个关于从 MVC Razor 视图调用 Ajax 的问题,他们经常建议您使用 Url.Action(...) 创建 URL。问题是,在这种情况下,这不是我的选择,因为我真的想将我的 Javascript 与我的 Razor 视图分开。另外,如果这是一个障碍,为什么从索引页面调用它时会起作用?

感谢您的帮助。

更新: 这是 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 调用时失败。

【问题讨论】:

  • 你的 route.config 是什么样的?
  • 使用“~/MyController/GetData”能解决问题吗?
  • @daniellepeley 如果是 @Url.Content(..) 之类的东西,那就行了。虽然这是 javascript,但路径无法像那样解析。
  • 您需要附加一个正斜杠(请参阅 rleffer 的回答),以便它相对于应用程序,而不是相对于当前 url。为避免此类问题,最好使用 var url = @Url.Content(..) 在视图中设置值,但由于脚本位于单独的文件中,您需要修改函数以接受 url 作为参数 function initialize(url){...
  • @Shoe 我已经添加了我的 RouteConfig.cs 文件。

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


【解决方案1】:

这取决于你的路由,但试试这个(在 MyController 前面放一个斜杠):

function initialize(){
    $.ajax({ url: /MyController/GetData, async: false })
        .done(function(returnedData) {
            doStuff(returnedData);
        });
}

它还可以帮助指定它是 get 还是 post,以及您希望它发送的数据类型。 Mvc 对 Json 很好:

function initialize(){
    $.ajax({ url: /MyController/GetData, async: false, dataType:"json", type:"Get" })
        .done(function(returnedData) {
            doStuff(returnedData);
        });
}

它在 index 页面上起作用的原因可能是因为细节必须显示在 url 中,但 index 没有。因此,如果您的索引 url 是 Home/Index,Home/ 仍然有效。有关详细信息,它必须显示为 Home/Details。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-08
    • 1970-01-01
    相关资源
    最近更新 更多