2013-04-29 3 views
1

Я создал проект VS MVC API с нуля, загрузил Nuget «WebApiContrib.Formatting.Jsonp», добавил маршрут, форматтер и попытался отправить параметры как сериализованный JSON в качестве запроса JSONP. Как определить или получить доступ к этим параметрам в контроллере?Как связать параметры API MVC в JSONP Get?

WebApiConfig:

config.Routes.MapHttpRoute(
    name: "DefaultApi", 
    routeTemplate: "api/{controller}/{id}/{format}", 
    defaults: new { id = RouteParameter.Optional, 
     format = RouteParameter.Optional } 
); 
config.Formatters.Insert(0, new JsonpMediaTypeFormatter()); 

Api Метод:

public IEnumerable<string> Get() 
{ 
    return new string[] { "value1", "value2" }; 
} 

JQuery:

$.ajax({ 
    type: 'GET', 
    url: '/api/Values', 
    data: JSON.stringify({ "message": "\"Hello World\"" }), 
    contentType: "application/json; charset=utf-8", 
    dataType: 'jsonp', 
    success: function (json) { 
     console.dir(json.sites); 
    }, 
    error: function (e) { 
     console.log(e.message); 
    } 
}); 

Я попытался модифицировать метод Api включать:

Get([FromUri] string value) 
Get([FromBody] string value) 
Get(CustomClass stuff) 
Get([FromUri] CustomClass stuff) 
Get([FromBody] CustomClass stuff) 

Где CustomClass определяются как:

public class CustomClass 
{ 
    public string message { get; set; } 
} 

До сих пор ни один из них не производит ничего, кроме нуля для параметров. Как мне связать эти параметры с объектом, опубликованным в строке запроса?

EDIT:

я могу обмануть его, изменив Аякса JQuery быть:

data: {"value":JSON.stringify({ "message": "\"Hello World\"" })} 

, для которых я могу де-stringify в [FromUri] string value и получить мой сильно типизированный объект.

Тем не менее, я ожидаю, что связующее данные данных де-сериализует параметры для строго типизированных объектов. Какая техника делает это?

+0

В настоящее время не очень уверен в точном решении, но попробуйте изменить параметр API имя файла для Id. i.e Получить ([FromUri] string id) .. См., если он работает. Может звучать из контекста, но просто попробуйте. – Shubh

ответ

1

Вы делаете запрос GET, а в случае GET запрашиваете тело только URI. Все предоставленные вами данные для $.ajax() вызова будет введен в URI, например, ваш РЕДАКТИРОВАТЬ версия будет генерировать URI, как это:

.../api/Values?value=%7B%22message%22%3A%22%5C%22Hello%20World%5C%22%22%7D 

(уведомление о том, что JSON будет также URL закодирован).

Теперь параметры URI в Web API в настоящее время связывают с использованием ModelBinderParameterBinding, что означает, что Web API не будет использовать любой MediaTypeFormatter (который выводит сложные типы), но ModelBinder/ValueProvider (который в этом случае будет выводить простой type - string).

Вы можете подойти к своему сценарию, выполнив заказ ModelBinder (не забудьте использовать соответствующие классы и интерфейсы из пространств имен ASP.NET Web API, а не ASP.NET те MVC):

public class JsonModelBinder : IModelBinder 
{ 
    public bool BindModel(HttpActionContext actionContext, ModelBindingContext bindingContext) 
    { 
     ValueProviderResult valueProviderResult = bindingContext.ValueProvider.GetValue(bindingContext.ModelName); 
     if (valueProviderResult == null) 
      return false; 

     bindingContext.Model = JsonConvert.DeserializeObject(valueProviderResult.AttemptedValue, bindingContext.ModelType); 

     return true; 
    } 
} 

public class JsonModelBinderProvider : ModelBinderProvider 
{ 
    public override IModelBinder GetBinder(HttpActionContext actionContext, ModelBindingContext bindingContext) 
    { 
     return new JsonModelBinder(); 
    } 
} 

и присоединение его к параметру с ModelBinderAttribute:

public IEnumerable<string> Get([ModelBinder(typeof(JsonModelBinderProvider))]CustomClass value) 
{ 
    return new string[] { "value1", "value2" }; 
} 

Вы можете найти более подробную информацию о теме здесь: