Asp.NET MVC Ajax-Post一个FORM和Ajax-Get

时间:2009-09-02 13:45:11

标签: asp.net-mvc jquery

我被困住了,谁能帮助我?在我的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);
    }
});

这个POST很完美。控制器操作的断点由调试器命中,并返回数据的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”的Controller Action被命中:

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

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

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

但是(第二次)点击(相同)确认按钮后,控制器动作最终点击[SetCompanyAndContinue]。

有人可以告诉我我做错了什么吗?非常感谢提前。

6 个答案:

答案 0 :(得分:2)

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

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

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

HTH

答案 1 :(得分:0)

尝试使用链接提交而不是正常的提交按钮,它可能在点击,ajax和表单之间发生冲突。

答案 2 :(得分:0)

我不知道我是否得到了正确的信息。但根据您的描述,点击“提交”按钮将尝试执行“发布”方法而不是“获取”方法。 只有在您首先访问该页面或刷新网址时才会进行“获取”调用。 使用链接按钮执行“获取”操作。

这就是为什么在你的样本中使用“Post”方法调用“/ Account / LogOnAjax /”这个动作。

答案 3 :(得分:0)

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

答案 4 :(得分:0)

marc.d是对的

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

答案 5 :(得分:0)

我的愚蠢错误:

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