Связывание непримитивных типов с использованием JsonValueProviderFactory - PullRequest
0 голосов
/ 02 апреля 2011

Я отправляю json в HttpPost Rest API

[HttpPut]
[ActionName("Device")]
public ActionResult PutDevice(Device d)
{
   return Content("");
}

Отправлено Json

{
"Name":"Pen",
"Type":1,
"DeviceSize":{"Width":190,"Height":180}
}

Устройство определено следующим образом:

public class Device
{
   public string Name {get; set;}
   public int Type {get; set;}
   public Size DeviceSize {get; set;}
}

Проблема в том, чтоИмя и Тип правильно связаны с JsonValueProviderFactory.Но DeviceSize типа Size не привязан и всегда пуст.

Чего мне не хватает?

У меня есть другие похожие свойства типа Point, Color и т. Д. Все они также НЕ связаны

Я уже добавил JsonValueProviderFactory в Application_Start файла Global.asax.cs

Спасибо.Пожалуйста, помогите.

1 Ответ

7 голосов
/ 02 апреля 2011

Трудно ответить на ваш вопрос, так как вы показали только части своего кода. Вот полный рабочий пример:

Модель:

public class Device
{
    public string Name { get; set; }
    public int Type { get; set; }
    public Size DeviceSize { get; set; }
}

public class Size
{
    public int Width { get; set; }
    public int Height { get; set; }
}

Контроллер:

[HandleError]
public class HomeController : Controller
{
    public ActionResult Index()
    {
        return View();
    }

    [HttpPut]
    [ActionName("Device")]
    public ActionResult PutDevice(Device d)
    {
        return Content("success", "text/plain");
    }
}

Просмотр (~/Views/Home/Index.aspx):

<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage" %>

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">

<script type="text/javascript" src="<%= Url.Content("~/scripts/jquery-1.4.1.js") %>"></script>
<script type="text/javascript">
    $.ajax({
        url: '<%= Url.Action("Device") %>',
        type: 'PUT',
        contentType: 'application/json',
        data: JSON.stringify({
            Name: 'Pen',
            Type: 1,
            DeviceSize: { 
                Width: 190, 
                Height: 180 
            }
        }),
        success: function (result) {
            alert(result);
        }
    });
</script>

</asp:Content>

Application_Start метод в Global.asax:

protected void Application_Start()
{
    AreaRegistration.RegisterAllAreas();
    RegisterRoutes(RouteTable.Routes);
    ValueProviderFactories.Factories.Add(new JsonValueProviderFactory());
}

Класс JsonValueProviderFactory был взят из Microsoft.Web.Mvc сборки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...