Хорошо, учитывая пример модели:
[DataContract]
public class Item
{
[DataMember]
public string Title { get; set; }
}
Вы можете создать фильтр действий, который десериализует ваши объекты из JSON:
/// <summary>
/// Deserialises a DataContract parameter from its JSON equivalence.
/// </summary>
public class JsonParameterFilter : ActionFilterAttribute
{
#region Properties
/// <summary>
/// Gets or sets the parameter name.
/// </summary>
public string Name { get; set; }
/// <summary>
/// Gets or sets the type of the parameter.
/// </summary>
public Type Type { get; set; }
#endregion
#region Methods
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
var request = filterContext.HttpContext.Request;
string contentType = request.ContentType;
if (!string.IsNullOrEmpty(contentType) && contentType.ToLower().Contains("application/json"))
{
var serialiser = new DataContractJsonSerializer(this.Type);
var @object = serialiser.ReadObject(request.InputStream);
filterContext.ActionParameters[Name] = @object;
}
}
#endregion
}
И применить к вашему действию:
[JsonParameterFilter(Name = "item", Type = typeof(Item))]
public ActionResult ProcessItem(Item item)
{
// Do stuff here
return View();
}
Вам необходимо убедиться, что вы публикуете данные с типом содержимого "application / json":
var item = ItemFactory.GetNewItem();
item.Title = "Something";
var json = $.toJSON(item);
$.ajax({
contentType: "application/json; charset=utf-8"
data: json,
dataType: "json",
type: "post",
url: "Controller/Action",
});
Очевидно, что ваша клиентская библиотека / скрипт должна быть в состояниисоздать экземпляр объекта javascript, который можно десериализовать как ваш экземпляр на стороне сервера.