代码之家  ›  专栏  ›  技术社区  ›  Johan Olsson

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

  •  3
  • Johan Olsson  · 技术社区  · 16 年前

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

    默认的ModelBinder是否应该能够绑定它(没有ActionFilter或自定义ModelBinder)?

    班级

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

    <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);
    }
    

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

    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;
            }
        }
    }
    

    岗位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
    

    邮政编码#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
    

    邮政编码#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 回复  |  直到 16 年前
        1
  •  0
  •   James Fleming    13 年前

    我可以想到两种方法来实现将复杂对象图发送回服务器的目标。一种是您最初尝试的方式,即用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" />,
    

    但确定的方法是查看响应。表单数据