У Фила Хаака есть отличная запись в блоге о том, как использовать 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;
}
}
}