ASP.NET MVC 3 JSONP: Работает ли это с JsonValueProviderFactory?

У Фила Хаака есть отличная запись в блоге о том, как использовать JSON, привязку данных и проверку данных.

Введите браузер " ограничение безопасности политики того же происхождения ". и JSONP, где вы используете $ .getJSON () для получения содержимого.

Есть ли встроенный в MVC 3 способ сделать это, или мне нужно следовать советам подобных сообщений ? Вы можете размещать контент? Я спрашиваю, потому что мой коллега, среди прочего, реализовал JsonPfilterAttribute, чтобы заставить эту работу работать. Очевидно, предпочтительнее избегать этого, если что-то уже существует в MVC 3.

Edit:

Резюме: все работает, за исключением доступа к переменной POST , т.е. как мне получить доступ к ] Переменная POST в контексте? (комментарий, отмеченный в последнем разделе кода)

Я решил использовать этот формат для вызова сервера:

$.ajax({
    type: "GET",
    url: "GetMyDataJSONP",
    data: {},
    contentType: "application/json; charset=utf-8",
    dataType: "jsonp",
    jsonpCallback: "randomFunctionName"
});

Что дает такой ответ:

randomFunctionName([{"firstField":"111","secondField":"222"}]);

И все это работает очень хорошо, если я использую GET . Однако я все еще не могу заставить это работать как POST . Вот исходный код, опубликованный Натаном Бриджуотером здесь . Эта строка не находит данные POST:

context.HttpContext.Request["callback"];

Либо я должен каким-то образом получить доступ к форме , либо валидаторы данных MVC удаляют переменные POST.

Как следует контекст .HttpContext.Request ["callback"]; должен быть записан для доступа к переменной POST или MVC по какой-то причине удаляет эти значения?

namespace System.Web.Mvc
{   public class JsonpResult : ActionResult
    {   public JsonpResult() {}

        public Encoding ContentEncoding { get; set; }
        public string ContentType { get; set; }
        public object Data { get; set; }
        public string JsonCallback { get; set; }

        public override void ExecuteResult(ControllerContext context)
        {   if (context == null)
               throw new ArgumentNullException("context");

            this.JsonCallback = context.HttpContext.Request["jsoncallback"];

            // This is the line I need to alter to find the form variable:

            if (string.IsNullOrEmpty(this.JsonCallback))
                this.JsonCallback = context.HttpContext.Request["callback"];

            if (string.IsNullOrEmpty(this.JsonCallback))
                throw new ArgumentNullException(
                    "JsonCallback required for JSONP response.");

            HttpResponseBase response = context.HttpContext.Response;

            if (!String.IsNullOrEmpty(ContentType))
               response.ContentType = ContentType;
            else
               response.ContentType = "application/json; charset=utf-8";

            if (ContentEncoding != null)
                response.ContentEncoding = ContentEncoding;

            if (Data != null)
            {   JavaScriptSerializer serializer = new JavaScriptSerializer();
                response.Write(string.Format("{0}({1});", this.JsonCallback,
                    serializer.Serialize(Data)));
    }   }   }

    //extension methods for the controller to allow jsonp.
    public static class ContollerExtensions
    {
        public static JsonpResult Jsonp(this Controller controller, 
               object data)
        {
            JsonpResult result = new JsonpResult();
            result.Data = data;
            result.ExecuteResult(controller.ControllerContext);
            return result;
        }
    }
}

7
задан Zachary Scott 25 January 2011 в 21:42
поделиться