【问题标题】:Issue with wrong controller being called in jquery ajax call在 jquery ajax 调用中调用错误控制器的问题
【发布时间】:2011-09-22 07:54:34
【问题描述】:

我的问题是出于某种奇怪的原因,它似乎卡在页面控制器中,所以我没有走出去进入 ajax 控制器,而是试图在页面控制器中沿着这条路线走

第一次尝试

http://localhost:2185/Alpha/Ajax/GetBlah_Name/?lname=Ge&fname=He

第二次尝试

http://localhost:2185/Patient/~/Ajax/GetBlah_Name/?lname=Ge&fname=He

目标

http://localhost:2185/Ajax/GetBlah_Name/?lname=Ge&fname=He

调用jquery的页面按钮

<a style="margin-left: 310px;" href="javascript:void(0)" onclick="getBlah()"
                    class="button"><span>Lookup</span></a>  

jQuery 代码

第一次尝试

{
   $.getJSON(callbackURL + 'Ajax/GetBlah_Name/?lname=' + $('#Surname').val() + '&fname=' + $('#FirstName').val(), null, GetResults)
}

第二次尝试

{
   $.getJSON(callbackURL + '~/Ajax/GetBlah_Name/?lname=' + $('#Surname').val() + '&fname=' + $('#FirstName').val(), null, GetResults)
}

总而言之,我不知道为什么它不会像在使用第一次尝试解决方案时所做的所有其他项目一样,它不会脱离控制器并进入 Ajax 控制器。

【问题讨论】:

  • 什么是callbackURL?您的路线定义如何?
  • 你试过$.getJSON('/Ajax/GetBlah/?lname...)吗?

标签: ajax asp.net-mvc-3


【解决方案1】:

您似乎想在 ~/Ajax 中调用控制器。是吗?如果是,您应该使用以下代码:

   $.getJSON(callbackURL + '/Ajax/GetBlah_Name/?lname=' + $('#Surname').val() + '&fname=' + $('#FirstName').val(), null, GetResults)

更新: 这将适用于您的 Q,但完整的解决方案是 @Darin Dimitrov 的答案。我建议你也使用它。

更新2 ~ 是一个只有 ASP.NET 才能使用的特殊字符!所以http 不明白。如果你用一个词开始你的url - 例如Ajax-,那么url 将从你现在的位置引用(我的英语不好,我无法解释好,请参阅示例)。例如,你在这里:

http://localhost:2222/SomeController/SomeAction

当您在此页面中创建链接时,使用此href

href="Ajax/SomeAction"

将被渲染为

http://localhost:2222/SomeController/Ajax/SomeAction

但是,当url/ 开头时,您指的是站点根目录:

href="/Ajax/SomeAction"

将是:

http://localhost:2222/Ajax/SomeAction

问候

【讨论】:

  • 好吧,这修复了它,不知道“/”是如何被删除的,但它不在我的另一个项目中并且有效,所以上帝知道那里发生了什么。我曾尝试过“~/”,因为我在其他路线中使用它来摆脱一切。
  • 更新答案以获得更多解释。
【解决方案2】:

您的 AJAX 调用存在几个问题:

  • 您正在硬编码路线
  • 您没有对查询字符串参数进行编码

以下是我建议您改进代码的方法:

// Always use url helpers when dealing with urls in an ASP.NET MVC application
var url = '@Url.Action("GetBlah_Name", "Ajax")';

// Always make sure that your values are properly encoded by using the data hash.
var data = { lname: $('#Surname').val(), fname: $('#FirstName').val() };

$.getJSON(url, data, GetResults);

甚至更好。将硬编码的锚点替换为已经在其 href 属性中包含查找 url 的锚点(这当然是由 url 助手生成的):

<a id="lookup" href="Url.Action("GetBlah_Name", "Ajax")" class="button">
    <span>Lookup</span>
</a> 

然后在一个单独的 javascript 文件中不显眼地对其进行 AJAX 化:

$(function() {
    $('#lookup').click(function() {
        var data = { lname: $('#Surname').val(), fname: $('#FirstName').val() };
        $.getJSON(this.href, data, GetResults);
        return false;
    });
});

现在,您的 url 的外观将完全取决于您在 Application_Start 方法中设置路由的方式。您的视图和 javascript 现在完全不可知,如果您决定更改路由模式,您将不需要 touch jaavscript 或视图。

【讨论】:

  • thx,我一定会在找到空闲时间后立即尝试这个(试图在明天之前完成所有这些项目的开发,到目前为止,我认为我不会但这是希望)
  • 我不能直接调用 GetBlah_Name 的唯一原因是,目前在 getBlah 函数中,它会进行 3 次检查以找出输入的数据,然后根据提供的数据将改变它所做的ajax调用。例如,如果提供了一个 ID 号,那么它会更准确和具体,因此它将按该 ID 而不是名称或另一个并不总是有数据的 ID 字段进行搜索。
  • @Darin Dimitrov - 嗨,你能帮我解决这个问题吗? stackoverflow.com/questions/7508241/… - 感谢您的任何想法和帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-05-13
  • 2012-04-16
  • 1970-01-01
  • 2015-01-17
  • 2012-11-04
  • 2019-03-24
  • 2015-01-01
相关资源
最近更新 更多