Как опубликовать массив сложных объектов (который имеет массив сложных объектов) с помощью jQuery - PullRequest
3 голосов
/ 11 марта 2010

Я хочу опубликовать некоторые продукты с идентификатором и некоторые категории с помощью jQuery. Но я получаю сообщение об ошибке:

Разве ModelBinder по умолчанию не может связывать это (без ActionFilter или пользовательского ModelBinder)?

Я пытался применить ActionFilter (для десериализации), который обнаружил в другом SO-потоке, но он никогда не запускается. Я также пытался с jQuery.ajaxSettings.traditional = true ;, jQuery 1.3.2 и 1.4.2. А в других примерах, которые я нашел, они просто публикуют ID, Имя и т. Д., А не другой массив сложных объектов.

Есть идеи?

Классы

public class Product
{
    public int ID { get; set; }
    public Category[] Categories { get; set; }
}

public class Category
{
    public int ID { get; set; }
}

HTML

<input id="Product[0]_ID" name="Product[0].ID" type="hidden" value="9" />
<input id="Product[0]_Categories[0]_ID" name="Product[0].Categories[0].ID" type="hidden" value="99" />
<input id="Product[1]_ID" name="Product[1].ID" type="hidden" value="8" />
<input id="Product[1]_Categories[0]_ID" name="Product[1].Categories[0].ID" type="hidden" value="88" />

Контроллер

[JsonFilter(Parameter = "p")]
public JsonResult GetProductPrice([Bind(Prefix = "Product")] Product[] p)
{
    // TODO: Implement some checking...
    return Json(true);
}

JQuery

$.post(getProductPriceUrl, $("form").serializeArray(), function(data) {
    $("#Price").html(data);
});

JsonFilter

public class JsonFilter : ActionFilterAttribute
{
    public string Parameter { get; set; }
    //public Type JsonDataType { get; set; }

    private JavaScriptSerializer serializer;

    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        serializer = new JavaScriptSerializer();

        if (filterContext.HttpContext.Request.ContentType.Equals("application/json"))
        {
            string inputContent;

            using (var sr = new StreamReader(filterContext.HttpContext.Request.InputStream))
            {
                inputContent = sr.ReadToEnd();
            }

            var result = serializer.Deserialize<Product>(inputContent);
            filterContext.ActionParameters[Parameter] = result;
        }
    }
}

POST # 1

__RequestVerificationToken=sz%2BLKCzTmdGMrH3TdOYipS5z%2BJ3uVyzBtJRZrruJoUohoGaH2O3DU5%2FcuU6hX1E%2F&Product%5B0%5D.ID=9&Product%5B0%5D.Categories%5B0%5D.ID=99&Product%5B1%5D.ID=8&Product%5B1%5D.Categories%5B0%5D.ID=88

POST # 2

__RequestVerificationToken=sz+LKCzTmdGMrH3TdOYipWTERHSdtCvGUhuw/dGIkgSL3rjcSLO7RJJN/rcssVwv&Product[0].ID=9&Product[0].Categories[0].ID=99&Product[1].ID=8&Product[1].Categories[0].ID=88

POST # 3

[{"name":"__RequestVerificationToken","value":"sz+LKCzTmdGMrH3TdOYipcqr8WKC2eL7CRS5BZUtwzD60WkqfnjdeAcO3DQg5ss6"},{"name":"Product[0].ID","value":"9"},{"name":"Product[0].Categories[0].ID","value":"99"},{"name":"Product[1].ID","value":"8"},{"name":"Product[1].Categories[0].ID","value":"88"}]

1 Ответ

0 голосов
/ 13 октября 2012

Есть два способа, которыми я могу придумать для достижения цели отправки графа сложных объектов обратно на сервер, правильно подключенный. Одним из них является способ, которым вы пытаетесь изначально, то есть выразить отношения в html. Другой - перейти к частичному просмотру дочерних объектов.

Таким образом, вы создадите частичное представление для списка категорий и передадите ему Product.categories. Это должно позаботиться о правильном подключении для вас.

Было бы

@Html.Partial("_myCategoriesPartialView", Model.Categories)

Это представление, конечно, будет повторять коллекцию. Я полагаю, что если вы хотите сделать это по-другому с HTML, это будет выглядеть так.

<input id="Product[0]_ID" name="Product[0].ID" type="hidden" value="9" />

должно быть

<input id="Product[0].ID" name="Product[0].ID" type="hidden" value="9" />,

но способ сказать наверняка - взглянуть на данные Response.Form

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