Вы не можете совершать перекрестные вызовы AJAX через JSON. Вам нужно использовать JSONP. Таким образом, вместо того, чтобы вернуться к регулярному JsonResult от вашего действия контроллера написать собственный результат действий, который будет обернуть JSON в функции обратного вызова, который передается в качестве параметра:
public class JsonpResult : ActionResult
{
private readonly object _obj;
public JsonpResult(object obj)
{
_obj = obj;
}
public override void ExecuteResult(ControllerContext context)
{
var serializer = new JavaScriptSerializer();
var callbackname = context.HttpContext.Request["callback"];
var jsonp = string.Format("{0}({1})", callbackname, serializer.Serialize(_obj));
var response = context.HttpContext.Response;
response.ContentType = "application/json";
response.Write(jsonp);
}
}
, а затем иметь ваше возвращение действия контроллера этого результата пользовательских действий:
public ActionResult SomeAction()
{
var result = new[]
{
new { Id = 1, Name = "item 1" },
new { Id = 2, Name = "item 2" },
new { Id = 3, Name = "item 3" },
};
return new JsonpResult(balances);
}
Теперь вы можете потреблять этот скрещенный домен:
var url = "http://example.com/SomeController/SomeAction/";
$.getJSON(url + '?callback=?', function (data) {
alert(data);
});
* домен *, * протокол * и * порт * приходится соответствовать. В противном случае запрос будет подпадать под ограничения * SOP *. – jAndy
Правильно ли настроен сервер, чтобы вернуть ответ JSONP? В вашем примере, поскольку вы не указали параметр обратного вызова, параметр GET, отправленный на сервер, будет называться «обратный вызов». –
, поэтому мы можем использовать JSONP ryt? – Apurv