【问题标题】:Asp.NET MVC Ajax-Post a FORM and Ajax-GetAsp.NET MVC Ajax-Post a FORM 和 Ajax-Get
【发布时间】:2025-12-15 02:15:02
【问题描述】:

我被困住了,谁能帮帮我?在我的 LogOn.aspx 视图中,我在 FORM 标记内有登录控件(用户名、密码、RememberMe):

<form id="loginform" method="post" action="/Account/LogOn/">

在下面,我有一个隐藏的 DIV,带有一个 OPTION 下拉列表和一个确认按钮,以及一个 onclick_event:

$.ajaxSetup({ cache: false });
$.ajax({
    type: "GET",
    url: "/Account/SetCompanyAndContinue",
    data: "{ 'id' : '1'}",
    contentType: "application/json; charset=utf-8",
    dataType: "json"
});

首先,用户登录。在 jQuery 中,我通过 AJAX 发布登录凭据:

var loginCred = new Object();
loginCred.Username = $('#userName').val();
loginCred.Password = $('#password').val();
loginCred.RememberMe = $('#rememberMe').checked;

var myJsonObject = JSON.stringify(loginCred);

$.ajaxSetup({ cache: false });
$.ajax({
    type: "POST",
    contentType: "application/json; charset=utf-8",
    url: "/Account/LogOnAjax/",
    data: myJsonObject,
    dataType: "json",
    success: function(data) {
        PostCredentialsSuccess(data);
    }
});

这篇文章很完美。控制器操作处的断点被调试器命中并返回一个 JSON 数据对象。我将此 JSON 数据放入 OPTION 下拉列表中。然后将该选项下拉列表呈现给用户。然后,当用户单击确认按钮时,会进行第二次 AJAX 调用:

$.ajaxSetup({ cache: false });
$.ajax({
    type: "GET",
    url: "/Account/SetCompanyAndContinue",
    data: "{ 'id' : '1'}",
    contentType: "application/json; charset=utf-8",
    dataType: "json"
});

我希望名为“SetCompanyAndContinue”的控制器操作会被命中:

    [AcceptVerbs(HttpVerbs.Get)]
    public ActionResult SetCompanyAndContinue(string id)
    {
        SessionAdapter.CustomerID = Convert.ToInt32(id);
        return null;
    }

但这并没有发生,相反,默认的控制器动作第一次被击中:

    public ActionResult LogOn()
    {
        return View();
    }

但是(!)当我第二次单击(相同的)确认按钮时,控制器操作最终会触发 [SetCompanyAndContinue]。

谁能告诉我我做错了什么?非常感谢。

【问题讨论】:

  • 你是如何绑定到确认按钮的?

标签: asp.net-mvc jquery


【解决方案1】:

您需要将 data 属性作为 javascript 对象而不是字符串传递

    $.ajax({ type: "GET",
    url: "/Account/SetCompanyAndContinue",
    data: ({id : 1}),
    contentType: "application/json; charset=utf-8", 
    dataType: "json" });

我建议使用 firebug 来查看从 jQuery 发送的实际 HTTP 请求,这样像这样的小错误很快就会很明显。

【讨论】:

    【解决方案2】:

    尝试使用链接提交而不是普通的提交按钮,它可能在点击、ajax 和表单之间存在冲突。

    【讨论】:

      【解决方案3】:

      我不知道我是否得到了正确的信息。但根据您的描述,单击“提交”按钮将尝试执行“发布”方法而不是“获取”方法。 “Get”调用仅在您第一次访问页面或刷新 url 时完成。 使用链接按钮执行“获取”操作。

      这就是为什么在您的示例中它使用“Post”方法调用“/Account/LogOnAjax/”这个动作。

      【讨论】:

        【解决方案4】:

        要比较不同的 GET 请求,您可以使用调试 HTTP 代理,例如 FiddlerCharles

        【讨论】:

          【解决方案5】:

          marc.d 是对的

          一般的经验法则(至少它适用于我):如果您的操作没有像您预期的那样被击中,则可能是您的路线参数有问题,或者您正在进入默认路线,与帖子一起发送的表单数据不是预期的。我使用 $(this).serialize() 作为 $post 的 JQuery 数据参数,而我的隐藏表单字段之一为空。未包含在任何路由中的操作(在这种情况下我让它成为默认值),从未看到过帖子。

          【讨论】:

            【解决方案6】:

            代表我犯的愚蠢错误:

            • 我在响应流中添加了一个 cookie,这使得 webbrower 的行为无法预测。
            • 我忘记将此标记为已回答

            【讨论】: