2010-03-11 1 views
3

ID가 있고 일부 카테고리가 jQuery로있는 제품을 게시하고 싶습니다. 그러나 나는 범주를 추가 할 때 Microsoft.Web.Mvc.DataAnnotations.DataAnnotationsModelBinder.BindProperty (NullReferenceException) 오류가 발생합니다.jQuery로 복잡한 객체의 배열을 게시하는 방법

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

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"}] 
+0

Response.Form 데이터를 살펴 보는 것입니다. 'POST' 데이터를 보여줄 수 있습니까? –

+0

어, 게시물 1과 2는 일반적인 키/값이고, 게시물 3은 JSON입니다. 당신은 어느 것을 의도하고, 왜 그것을 두 가지 방법으로합니까?일반적으로 MVC에서 표준 POST를 선호합니다. JSON은 특별한 처리가 필요하기 때문입니다. –

+0

표준 POST를 사용하고 싶지만 테스트를하고 몇 시간이 지나면 제대로 작동하지 않습니다. 나는 그 솔루션으로 일부 SO 스레드를 읽은 후에 JSON과 "JsonFilter"로 시도 했으므로 가능하다고 의심하기 시작했습니다. –

답변

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" />, 

해야하지만 확실히 말할 수있는 방법은 당신이 ActionFilter을 필요가 없습니다