如何从JQuery调用控制器方法?

7

我有一个用于asp.net(非MVC)的ajax代码,用于调用webMethod从服务器获取请求的其他数据。但是我似乎无法弄清楚在MVC中要给我的JQuery哪个URL。

<script type="text/javascript" language="javascript">
function SubmitAjax(url, message, successFunc, errorFunc) {
    $.ajax({
        type:"POST",
        url:url,
        data:message,
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        success:successFunc,
        error:errorFunc
        });

};

我不想将所有相关数据的完整列表传递给每个到达页面的人,因为并非所有人都需要此功能。因此,我想通过JQuery调用控制器或WebMethod,但似乎找不到如何在MVC中寻址URL。

我注意到这篇文章: JQuery Ajax调用被解析为当前控制器文件夹,而不是根目录

$.getJson是mvc方法吗?这对我的用例来说是一个好的解决方案吗?我只需要返回一个字符串url,或者如果我要查找的内容未找到,则返回一个空字符串。我需要为$.getJSon方法包含一个<script>标签吗?那是MVC的一部分还是JQuery的一部分?前导斜杠会指向应用程序根目录还是服务器根目录?


MVC不是具有实际函数名称的特定库,而是一种设计模式...除非微软实际上为此命名了框架...想想看,他们可能会这样做。原创性不是他们的强项。(谷歌一下...)- 但就重点而言...$.getJson是一个jQuery函数,用于通过AJAX请求获取JSON数据。与.Net没有任何特定关系。 - Atli
一个URL始终是一个URL,在ASP.NET MVC中并没有任何不同的工作方式。 - Mattias Jakobsson
@Atli,我不确定你指的是哪个部分,在顶部我是在提到Asp.net MVC,在底部我是在提到捆绑的Asp.net MVC JavaScripts。 - Maslow
@Mattias,根据您所调用的内容、WebMethod或者是否有其他方式,MVC中的URL会有所不同。如果直接调用控制器操作而不是WebMethod,则也会有所不同。 - Maslow
@Maslow 只需启动调试器,您就会看到错误。如果您尝试调用的操作没有被触发,则您的 URL 有误。请参见我的答案,了解 URL 工作原理的说明。 - Mattias Jakobsson
显示剩余7条评论
5个回答

3

@Johannes 谢谢,这是我的URL: "Ticket/CheckForInstaller" 但是我收到了“未找到”的错误。我的控制器类是 TicketController,方法是 [WebMethod] public ContentResult CheckForInstaller(int appId),但它们没有对齐。 - Maslow
@Maslow,你需要为你的操作提供适当的参数。你的操作是“CheckForInstaller”,它需要“appId”。如果在你的路由中注册了这个操作,你可以简单地调用“Ticket/CheckForInstaller/1”(“1”只是appId的一个示例)。如果没有注册,应该像这样:“Ticket/CheckForInstaller?appId=1”。 - Johannes Setiabudi
1
在这个例子中,他正在使用POST,因此“appId”应该是一个POST参数(不可见于URL)。 - Mattias Jakobsson

2
我的猜测是您对URL的构建方式感到困惑。如果URL前面没有斜杠,则相对于当前URL。所以,如果当前的URL是:/Home/Index,并且您有这样的链接:<a href="Ticket/CheckForInstaller">Text</a>,那么该链接将指向以下URL:/Home/Index/Ticket/CheckForInstaller。这是浏览器中的行为。在WebForms应用程序的文件夹中有页面时,同样会发生这种情况。与任何其他Web框架一样,ASP.NET MVC URL没有什么不同。您可能需要的URL是:/Ticket/CheckForInstaller
但是,ASP.NET MVC框架提供了帮助程序,使您无需硬编码任何URL。您可以这样做:
<%=Url.Action("Ticket", "CheckForInstaller")%>

但是这样做的唯一作用就是找到指向该操作的适当url(根据您的路由可能是“/Ticket/CheckForInstaller”)并将其写出。


1
你可以使用 $.getJSON(url,[data],[callback(data)]),其中 data 是你返回的 json 数据对象。
或者你也可以使用 $.post(url,[data],[callback(data)]),其中 data 是你返回的字符串/数据对象。 url:这是相对于你的控制器/动作/脚本的相对路径,它将返回 json/数据。
以上是 jQuery 的方法,只要你已经包含了 jQuery js 文件,就可以使用它们。

1

这是我最近一直在做的事情,而且效果很好。

  1. 获取根路径并将其存储在隐藏输入中(用 < 替换 [)

    [input id="urlBase" type="hidden" value="<%= Url.Content("~") %>" />

  2. 获取该输入的值并将其存储在 js 中(在此示例中使用 jquery)

    _urlBase = $("#urlBase").val();

  3. 使用该变量调用控制器

    $.ajax({ type: "GET", url: _urlBase + "Controller/Action", dataType: "json" });


0
问题出在控制器上的webMethod标签,在asp.net中是必需或有帮助的,但在asp.net mvc中不需要。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接