我想使用jQuery发布一些带有ID和类别的产品。但是,当我添加类别时,在Microsoft.Web.Mvc.DataAnnotations.DataAnnotationsModelBinder.BindProperty(NullReferenceException)中出现错误。
默认的ModelBinder不应该能够绑定这个吗(没有ActionFilter或自定义ModelBinder)?
我尝试应用在另一个SO线程中找到的ActionFilter(进行反序列化),但它从未运行过。我还尝试了jQuery.ajaxSettings.traditional = true;、jQuery 1.3.2和1.4.2。在我找到的其他示例中,它们只发布ID、名称等,而不是另一个复杂对象数组。
有任何想法吗?
类
默认的ModelBinder不应该能够绑定这个吗(没有ActionFilter或自定义ModelBinder)?
我尝试应用在另一个SO线程中找到的ActionFilter(进行反序列化),但它从未运行过。我还尝试了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;
}
}
}
文章 #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
第三篇文章
[{"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"}]