【问题标题】:Ajax Post to Controller Action Cross domainAjax 发布到控制器动作跨域
【发布时间】:2013-03-09 15:10:02
【问题描述】:

我在“网站 A”上有一个表单,它发布到“网站 B”。代码包含在下面。

我无法从我的目标域获得成功或返回消息。

有什么建议吗?我做错了什么?

<script type="text/javascript">

$.fn.serializeObject = function()
{
   var o = {};
   var a = this.serializeArray();
   $.each(a, function() {
       if (o[this.name]) {
           if (!o[this.name].push) {
               o[this.name] = [o[this.name]];
           }
           o[this.name].push(this.value || '');
       } else {
           o[this.name] = this.value || '';
       }
   });
   return o;
};

$(document).ready(function(){
    $("#submit").bind("click", function(){

        //turn form into json
        var formData = $("#digForm").serializeObject();
        var jsonData = JSON.stringify(formData);


        alert(jsonData);

        $.ajax({
            url: URL,
            data: jsonData,
            dataType: 'jsonp',
            cache: false,
            success: function (data) {
                alert(data);
            },
            error: function (jqXHR, textStatus, errorThrown) {
                                alert(errorThrown);
                            }
        });
    })
});
</script>

这里是控制器:

[HttpPost]
public ActionResult Index(string submission)
{
    SubmissionModel model = new SubmissionModel();

    //validate everything we need is here
    var serializer = new JavaScriptSerializer();

    // get json data from url
    var json =  submission;
    var submissionData = serializer.Deserialize<SubmissionModel>(json);

    model.SiteID = submissionData.SiteID;
    model.FirstName = submissionData.FirstName;
    model.LastName = submissionData.LastName;
    model.Email = submissionData.Email;
    model.Comments = submissionData.Comments;
    model.Like = submissionData.Like;
    model.Dislike = submissionData.Dislike;
    model.SubmitDate = DateTime.Now;
    db.Submissions.Add(model);
    db.SaveChanges();

    return View();
}

【问题讨论】:

  • 错误信息是什么?

标签: jquery ajax asp.net-mvc asp.net-mvc-3 post


【解决方案1】:

您使用的是 json,但对于跨浏览器的 ajax 帖子,您应该使用 jsonp

http://forums.asp.net/t/1780255.aspx/1

【讨论】:

  • 不,他不用jsonp,你也可以用json发送数据
  • @Mariusz,请详细说明。如果我遗漏了一些东西,我想更好地理解。考虑到流程,DaveA 的回答似乎是错误的。
  • 您可以通过使您的服务器接受带有 OPTIONS 标头w3的请求,在 CORS 中发送 json
  • @AnthonyShwartz 我对此仍有疑问,您有可以详细说明的代码示例吗?
  • @BrentonPierce,让我看看你到目前为止所做的尝试......在你的帖子中添加代码
【解决方案2】:

需要这样做:

$.ajax({
    url: URL,
    data: {submission: jsonData},
    dataType: 'jsonp',
    cache: false,
    success: function (data) {
        alert(data);
    },
    error: function (jqXHR, textStatus, errorThrown) {
        alert(errorThrown);
    }
});

【讨论】:

    【解决方案3】:

    我过去也遇到过类似的问题。

    冒着教奶奶吸鸡蛋的风险......

    一、关于问题的诊断 我很确定这是一个同源策略问题,因为这些结果没有得到成功或错误消息,这是非常典型的。 为了诊断它,您可以 是在 firefox 上使用 firebug,并查看 http 请求/响应本身。在那里您看到响应,因为这是在被浏览器过滤之前。

    关于解决方案。

    就像 Anthony 说的,你可以使用 jsonp。 JsonP 实际上是一种 hack,它通过隐藏数据,就好像它是一个 JS 函数一样,围绕同源策略工作。

    为此,我通常使用 getJson 而不是 ajax()。 http://api.jquery.com/jQuery.getJSON/

    我通过在帖子参数中添加“callback=AnyName”手动将其设置为使用 jsonp。

    另外,我看不到你服务器B的响应码,但是json数据需要用AnyName();所以如果你的 json 数据是 {json, data},你的响应应该是 AnyName({json,data});

    【讨论】:

    • 如何添加回调?
    猜你喜欢
    • 1970-01-01
    • 2011-11-24
    • 2015-08-12
    • 2013-08-10
    • 2012-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多