为了账号安全,请及时绑定邮箱和手机立即绑定

ASP.net MVC返回JSONP

ASP.net MVC返回JSONP

呼唤远方 2019-12-20 10:10:52
我正在寻找跨域返回一些JSON的方式,并且我知道这样做的方法是通过JSONP而非纯JSON。我使用的是ASP.net MVC,因此我在考虑只扩展JSONResult类型,然后扩展ig Controller,以便它也实现了Jsonp方法。这是最好的解决方法,还是有内置的ActionResult可能更好?编辑:我继续这样做。仅供参考,我添加了一个新结果: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            }        }    }还有我所有控制器的超类的几种方法: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            };        }奇迹般有效。
查看完整描述

3 回答

?
凤凰求蛊

TA贡献1825条经验 获得超4个赞

我没有使用Jsonp()方法对控制器进行子类化,而是采用了扩展方法路线,因为它对我来说感觉更干净。关于JsonpResult的好处是,您可以像测试JsonResult一样完全测试它。


我做了:


public static class JsonResultExtensions

{

    public static JsonpResult ToJsonp(this JsonResult json)

    {

        return new JsonpResult { ContentEncoding = json.ContentEncoding, ContentType = json.ContentType, Data = json.Data, JsonRequestBehavior = json.JsonRequestBehavior};

    }

}

这样,您不必担心创建所有不同的Jsonp()重载,只需将您的JsonResult转换为一个Jsonp。


查看完整回答
反对 回复 2019-12-20
  • 3 回答
  • 0 关注
  • 584 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信