问题描述
我希望跨域返回一些 JSON,我知道这样做的方法是通过 JSONP 而不是纯 JSON.
我正在使用 ASP.net MVC,所以我想只扩展 JsonResult
类型,然后扩展控制器,以便它也实现了 Jsonp 方法.
这是最好的方法还是有一个内置的 ActionResult
可能更好?
I am looking to return some JSON across domains and I understand that the way to do this is through JSONP rather than pure JSON.
I am using ASP.net MVC so I was thinking about just extending the JsonResult
type and then extending the Controller so that it also implemented a Jsonp method.
Is this the best way to go about it or is there a built-in ActionResult
that might be better?
解决方案:我继续这样做了.仅供参考,我添加了一个新结果:
Solution: I went ahead and did that. Just for reference sake I added a new result:
public class JsonpResult : System.Web.Mvc.JsonResult
{
public override void ExecuteResult(ControllerContext context)
{
if (context == null)
{
throw new ArgumentNullException("context");
}
HttpResponseBase response = context.HttpContext.Response;
if (!String.IsNullOrEmpty(ContentType))
{
response.ContentType = ContentType;
}
else
{
response.ContentType = "application/javascript";
}
if (ContentEncoding != null)
{
response.ContentEncoding = ContentEncoding;
}
if (Data != null)
{
// The JavaScriptSerializer type was marked as obsolete prior to .NET Framework 3.5 SP1
#pragma warning disable 0618
HttpRequestBase request = context.HttpContext.Request;
JavaScriptSerializer serializer = new JavaScriptSerializer();
response.Write(request.Params["jsoncallback"] + "(" + serializer.Serialize(Data) + ")");
#pragma warning restore 0618
}
}
}
以及我所有控制器的超类的几个方法:
and also a couple of methods to a superclass of all my controllers:
protected internal JsonpResult Jsonp(object data)
{
return Jsonp(data, null /* contentType */);
}
protected internal JsonpResult Jsonp(object data, string contentType)
{
return Jsonp(data, contentType, null);
}
protected internal virtual JsonpResult Jsonp(object data, string contentType, Encoding contentEncoding)
{
return new JsonpResult
{
Data = data,
ContentType = contentType,
ContentEncoding = contentEncoding
};
}
就像一个魅力.
推荐答案
这里有一个简单的解决方案,如果你不想定义一个动作过滤器
Here is a simple solution, if you don't want to define an action filter
使用 jQuery 的客户端代码:
Client side code using jQuery:
$.ajax("http://www.myserver.com/Home/JsonpCall", { dataType: "jsonp" }).done(function (result) {});
MVC 控制器动作.使用 JavaScript 代码执行查询字符串提供的回调函数返回内容结果.还为响应设置 JavaScript MIME 类型.
MVC controller action. Returns content result with JavaScript code executing callback function provided with query string. Also sets JavaScript MIME type for response.
public ContentResult JsonpCall(string callback)
{
return Content(String.Format("{0}({1});",
callback,
new JavaScriptSerializer().Serialize(new { a = 1 })),
"application/javascript");
}
这篇关于ASP.net MVC 返回 JSONP的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!