2013-02-01 4 views
1

ASP.Net에 문제가있어 머리가 찢어지기 쉽습니다. 다른 접근 방식을 사용하여 모델의 일부를 바인딩 할 수는 있지만 모든 데이터를 바인딩 할 수있는 방법은 없습니다.복잡한 형식의 ASP.NET MVC 매개 변수 바인딩이 실패했습니다

컨트롤러 액션 서명 JSON 데이터를 전송하도록 시도 ProfileKnockOutQuestionModel 클래스

public sealed class ProfileKnockOutQuestionModel { 

    /// <summary> 
    /// Parameterless constructor is required for auto-passing GET/POST data to controller actions. 
    /// </summary> 
    public ProfileKnockOutQuestionModel() { } 


    [Required] 
    [DisplayName("Lead Type Id")] 
    public Int32 AdminLeadType { get; set; } 

    //[Required] 
    //[DisplayName("Question Type")] 
    [UIHint("GridForeignKey")] 
    public Int16 QuestionTypeId { get; set; } 

    [Required] 
    [DisplayName("Question Text")] 
    public String QuestionText { get; set; } 

    [Required] 
    [DisplayName("Pass Answer")] 
    public String Answer1Text { get; set; } 

    [Required] 
    [DisplayName("Fail Answer")] 
    public String Answer2Text { get; set; } 

    [Required] 
    [DisplayName("Price")] 
    [DataType(DataType.Currency)] 
    [Range(0, Int16.MaxValue)] 
    public Decimal Price { get; set; } 

    public Int32 ProfileKnockOutQuestionId { get; private set; } 

    public Int32 ProfileId { get; private set; } 

    public Int32 ParentProfileId { get; private set; } 

    public Int32 CustomerId { get; private set; } 

    public Int32 AdminKnockOutQuestionId { get; private set; } 

관련 데이터 멤버 인코딩

// Post: Profile/{customerId}/SetKnockOutQuestions/{profileId} 
[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult SetKnockOutQuestions(Int32 customerId, 
    Int32 profileId, 
    Int32 parentProfileId, 
    IEnumerable<ProfileKnockOutQuestionModel> questions) 
{ 

,

$.ajax({ 
    url: "/mvc/Profiles/78219/SetKnockOutQuestions/1605111", 
    data: JSON.stringify({ questions: data, 
     parentProfileId : 1605105 
    }), 
    type: "POST", 
    contentType: "application/json; charset=utf-8" 
}); 

이 데이터를 전송하는 자바 스크립트 코드 (간결함을 위해 손질)

{ 
"questions":[ 
    { 
    "AdminKnockOutQuestionId":8, 
    "AdminLeadType":4, 
    "Answer1Text":"Ya really!", 
    "Answer2Text":"no wai", 
    "CustomerId":78219, 
    "ParentProfileId":1605105, 
    "Price":2, 
    "ProfileId":1605111, 
    "ProfileKnockOutQuestionId":0, 
    "QuestionText":"Really? Auto", 
    "QuestionTypeId":0 
    }, 

하지만 작업을 마치면 모델 바인더는 문자열, 가격 및 AdminLeadType 만 바인딩합니다. 나머지 데이터는 모두 0입니다. 모든 올바르게 구문 분석 된 필드가 있었고 아무 것도 변경되지 않았다는 것을 알게 된 후 [Required][DisplayName("")] 특성을 나머지 숫자 필드에 추가하려고했습니다.

내가 보내려고하는 다른 방법은 일반적인 형식의 인코딩 된 게시물입니다.

는 AXAJ의에 javscript는

크롬의 네트워크 관리자에서 붙여 넣은 다음 (복사/같은 게시물 본문에 결과
$.ajax({ 
    url: "/mvc/Profiles/78219/SetKnockOutQuestions/1605111", 
    data: { questions: data, 
     parentProfileId : 1605105 
    }, 
    type: "POST", 
}); 

내가 대신 않은 구문 분석, URL 인코딩 된 버전을 게시 할 수도 있지만 그냥 저를 신뢰 앰퍼샌드 등은 모두 순서대로 사용됩니다) :

questions[0][AdminKnockOutQuestionId] = 8 
questions[0][AdminLeadType] = 4 
questions[0][Answer1Text] = Ya really! 
questions[0][Answer2Text] = no wai 
questions[0][CustomerId] = 78219 
questions[0][ParentProfileId] = 1605105 
questions[0][Price] = 2 
questions[0][ProfileId] = 1605111 
questions[0][ProfileKnockOutQuestionId] = 0 
questions[0][QuestionText] = Really? Auto 
questions[0][QuestionTypeId] = 0 

이것은 반대의 문제가 있습니다. 모델 상태가 괴롭히고 Request 객체의 VS 디버거 뷰에서 명확하게 볼 수는 있지만 모든 String 값이 누락되었다고해서 아무 것도 바인딩되지 않습니다.

내 모델 바인딩에 문제가 있습니까?

답변

1

을 위해 작동합니다 알고

public ActionResult SetKnockOutQuestions(
    ProfileQuestions profileQs) 
{ 

에 작업을 변경 실패 개인 세터.아마도 모델 바인더가 바인더를 바인딩 할 것으로 기대할 수는 없습니다. 당신의 AJAX 요청이 잘 보인다는 구속 할 공공 세터가 모든 속성을 한 번

public sealed class ProfileKnockOutQuestionModel 
{ 
    /// <summary> 
    /// Parameterless constructor is required for auto-passing GET/POST data to controller actions. 
    /// </summary> 
    public ProfileKnockOutQuestionModel() { } 

    [Required] 
    [DisplayName("Lead Type Id")] 
    public Int32 AdminLeadType { get; set; } 

    //[Required] 
    //[DisplayName("Question Type")] 
    [UIHint("GridForeignKey")] 
    public Int16 QuestionTypeId { get; set; } 

    [Required] 
    [DisplayName("Question Text")] 
    public String QuestionText { get; set; } 

    [Required] 
    [DisplayName("Pass Answer")] 
    public String Answer1Text { get; set; } 

    [Required] 
    [DisplayName("Fail Answer")] 
    public String Answer2Text { get; set; } 

    [Required] 
    [DisplayName("Price")] 
    [DataType(DataType.Currency)] 
    [Range(0, Int16.MaxValue)] 
    public Decimal Price { get; set; } 

    /// <summary> 
    /// Public setters are required for passing GET/POST data to controller actions. 
    /// </summary> 
    public Int32 ProfileKnockOutQuestionId { get; set; } 

    /// <summary> 
    /// Public setters are required for passing GET/POST data to controller actions. 
    /// </summary> 
    public Int32 ProfileId { get; set; } 

    /// <summary> 
    /// Public setters are required for passing GET/POST data to controller actions. 
    /// </summary> 
    public Int32 ParentProfileId { get; set; } 

    /// <summary> 
    /// Public setters are required for passing GET/POST data to controller actions. 
    /// </summary> 
    public Int32 CustomerId { get; set; } 

    /// <summary> 
    /// Public setters are required for passing GET/POST data to controller actions. 
    /// </summary> 
    public Int32 AdminKnockOutQuestionId { get; set; } 

    ... 
} 

:

$.ajax({ 
    url: "/mvc/Profiles/78219/SetKnockOutQuestions/1605111", 
    data: JSON.stringify({ 
     questions: data, 
     parentProfileId : 1605105 
    }), 
    type: "POST", 
    contentType: "application/json; charset=utf-8" 
}); 
+0

나는 지금 당장 자신에게 좌절감을 느낀다. 내가 12 번 간과 한 것을 붙잡아 주셔서 감사합니다. –

+0

기꺼이 도와 드리겠습니다. –

0

나는 배열을 게시 한 적이 없다고 생각하지만 왜 작동하지 않는지 알 수는 없습니다.

첫째, 두 번째 시도에서, 나는 당신이 아약스의 전통 매개 변수가 너무 MVC 그것을 받아 ASP를 사용하는 믿습니다 :

내가 도움이 될 몇 가지를 언급하고자합니다.

두 번째로 JSON 게시를 위해 JSON.stringify를 사용할 필요가 없으므로 제거하지 않으려한다고 생각합니다.

마지막으로 모든 사람이 그래서 만약

public class ProfileQuestions 
{ 
    public Int32 customerId {get;set;} 
    public Int32 profileId {get;set;} 
    public Int32 parentProfileId {get;set;} 
    public IEnumerable<ProfileKnockOutQuestionModel> questions {get;set;} 
} 

같은 새로운 모델을 내가 마지막 옵션은 귀하의 속성을 가지고 있는지

+0

내가 [기존] (HTTP 밖으로 시도 : // API 그래서 공공 setter를 추가 .jquery.com/jQuery.param /) 당신이 언급 한 그것은 아무것도 변경하지 않았다; 시체는 같았습니다. 기본 유형 (비 객체)에 영향을 미치지 않거나 키 충돌이 없거나 둘 다 내 데이터 세트에 적용되지 않는 것 같습니다. 또한 content-type 매개 변수를 설정 했음에도 불구하고 데이터를 JSON.stringify해야합니다. 그렇지 않으면 jQuery가 url-form-encoded 형식으로 다시 변환합니다. 이것은'type : "POST"동작의 특징입니다. –

+0

다른 것을 찾지 못하면 내일 제안 할 더욱 복잡한 모델을 시도해 볼 수 있습니다. 나는 그것을 오히려 오히려 그대로 유지하고 싶습니다 ... –

+0

조심해야 할 또 하나의 일은 이름 충돌입니다. MVC가 내 데이터를 바인딩하려고 시도했을 때 2 개의 이름이 충돌했기 때문에 몇 번 붙어있었습니다. Action 매개 변수의 CustomerId, profileid 등이 필요하지 않으면이를 제거하십시오. – Charles