如何使用jQuery发布一组复杂对象(具有一组复杂对象)

时间:2010-03-11 12:39:05

标签: jquery asp.net-mvc linq-to-entities

我想发布一些带有ID和一些带有jQuery的类别的产品。但是当我添加类别时,我收到了一个错误:Microsoft.Web.Mvc.DataAnnotations.DataAnnotationsModelBinder.BindProperty(NullReferenceException)。

默认的ModelBinder不能绑定它(没有ActionFilter或自定义ModelBinder)吗?

我尝试应用我在另一个SO线程中找到的ActionFilter(反序列化),但它从未运行过。我也试过jQuery.ajaxSettings.traditional = true ;, jQuery 1.3.2和1.4.2。在我发现的其他示例中,它们只是发布ID,Name等,而不是另一个复杂对象数组。

有什么想法吗?

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 :(得分:0)

我可以通过两种方式来实现将复杂对象图发送回正确连接的服务器的目标。一个是你最初尝试的方式,即在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数据