Ajax发布到控制器操作跨域

时间:2013-03-09 15:10:03

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

我在“网站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();
}

3 个答案:

答案 0 :(得分:1)

你正在使用json但是对于跨浏览器的ajax帖子你应该使用jsonp

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

答案 1 :(得分:1)

需要这样做:

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

答案 2 :(得分:0)

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

有教奶奶吸蛋的风险......

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

关于解决方案。

就像安东尼说的,你 CAN 使用jsonp。 JsonP实际上是一个通过隐藏数据来解决同源策略的hack,就好像它是一个JS函数一样。

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

我将它设置为手动使用jsonp,在post参数中添加“callback = AnyName”。

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