2010-12-17 96 views
2

我知道这个问题是非常熟悉的,但我不能超过它。ASP.NET MVC2 JsonResult此请求已被阻止

这是我的控制器动作

public JsonResult AddToCart(int productId, int quantity = 1, int optionValue = 0) 
{ 
    AjaxActionResponse res = new AjaxActionResponse(); 
    res.Result = ture; 
    ...... 
    return Json(res, JsonRequestBehavior.AllowGet); 
} 

,这是我的Ajax请求

$.ajax({ 
    type: "GET", 
    contentType: "application/json; charset=utf-8", 
    url: "<%= Url.Action("AddToCart", "CartAjax") %>", 
    data: ({'productId': productId, 'quantity': quantity, 'optionValue': optionValue}), 
    dataType: "json", 
    success: function (d) { 
     if ($.isEmptyObject(d)) { 
      return; 
     } 
     if (!d.Result) { 
      alert(d.ErrorMessage[0].ErrorMessage); 
     } 
     else { 
      $("#myCartBox").dialog("open"); 
     } 
     return; 
    } 
}); 

当我运行知错误Ajax请求弹出

这一要求已被封锁因为 敏感信息可能是 向第三方网站si披露当在GET请求中使用它时使用测试 。要允许GET请求,请将 设置为允许获取JsonRequestBehavior。

我试图使AddToCart动作[HttpPost]上可接受的,但在这个时间:参数从未到达的方法,并从该请求返回缺少的参数误差(500 INT SERV错误。)

我只能运行得到的方法,但请求已被阻止在这个时候:)

我错过了什么?或者什么是MVC2 Ajax请求的正确方法。 WebForms非常成功地从JavaScript调用方法,但我无法在MVC上做到这一点。

任何想法?

回答

1

您是否尝试过使用POST方法使用此方法签名?

[HttpPost] 
public ActionResult AddToCart(FormCollection form) 

或者使用数据绑定:

public class CartItem { 
    public int productId {get; set;} 
    public int quantity {get; set;} 
    public int optionValue {get; set;} 
} 

然后:

​​

不幸的是我没有一个很好的答案,但我已经解决了一些我自己的问题,这(而不是弄清楚如何使用路由很好地传递参数)。

+0

哦,我的上帝,它的工作:)我认为,模型绑定是正确的这种请求的方式。非常感谢@mootinator和其他参与者:) – Orhaan 2010-12-17 02:40:34

1

我不确定这是您的根本问题,但您不应将content-type设置为text/html。这不是您要发送的内容或MVC期望的内容。完全忽略该参数,并让jQuery将其设置为application/x-www-form-urlencoded,这很合适。

+0

嗯,你是对的,但它只是试图。我的代码的第一个版本有“application/json”内容类型,但没有什么不同。 – Orhaan 2010-12-17 02:21:35

+0

application/json也是不正确的。该数据参数不会作为JSON发送到服务器。尝试省略内容类型; jQuery自动将它设置为正确的urlencoded请求。 – 2010-12-17 02:23:07

+0

实际上你可以完全省略'contentType'并让jQuery设置它。 – 2010-12-17 02:24:42