ASP.net MVC返回JSONP

我正在寻找跨域返回一些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

            };

        }

奇迹般有效。


呼唤远方
浏览 589回答 3
3回答

凤凰求蛊

我没有使用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。
打开App,查看更多内容
随时随地看视频慕课网APP