2015-01-18 4 views
0

아주 이상한 방식으로 작동하는 기본 모델 바인더에 문제가 있습니다. 일부 데이터를 컨트롤러 동작에 POST하려고 시도하고 이러한 데이터 필드가 코딩 한 뷰 모델 클래스에 바인딩 될 것으로 예상합니다. 이 서버모델 바인더 매우 이상한 오류

Fiddler request

에 도착 요청입니다

public class CashRegisterViewModel 
{ 
    [Required] 
    [Display(Name = "CashRegisterID")] 
    public int CashRegisterID { get; set; } 

    [Required] 
    [Display(Name = "RegisterCode")] 
    public string RegisterCode { get; set; } 

    [Required(AllowEmptyStrings = true)] 
    [Display(Name = "Cash model")] 
    public string Model { get; set; } 

    [Required(AllowEmptyStrings = true)] 
    [Display(Name = "Concept")] 
    public string Concept { get; set; } 

    [Required(AllowEmptyStrings = true)] 
    [Display(Name = "IP Address")] 
    public string IPAddress { get; set; } 

    [Required(AllowEmptyStrings = true)] 
    [Display(Name = "External Cash Register Code")] 
    public string ExternalCashRegisterCode { get; set; } 

    [Required] 
    [Display(Name = "PoS ID")] 
    public int PoSID { get; set; } 
} 

이 피들러를 보면 컨트롤러 액션 메소드

[HttpPost] 
[ValidateAntiForgeryToken] 
public ActionResult SaveCashRegister(CashRegisterViewModel model) { 
    if (ModelState.IsValid) { 
     [...] 
    } 
} 

은 다음과 같습니다

은보기 모델 클래스

그러나 코드를 실행할 때 ModelState.IsValid 항상 false이며 ModelState를 살펴보면 다음 오류가 표시됩니다.

{"The parameter conversion from type 'System.String' to type 'MyProject.ViewModel.Common.CashRegisterViewModel' failed because no type converter can convert between these types."} 

누군가이 동작에 대해 제안 할 수 있습니까?

답변

2

문제는보기 모델에 model 속성 이름이 포함되어 있고 POST 메서드의 이름이 같은 매개 변수입니다. 매개 변수를 모델의 특성 이름과 바르게 바인딩 할 다른 것으로 변경하십시오. 예 : 내부에서 무슨 일이 일어나고 무엇

public ActionResult SaveCashRegister(CashRegisterViewModel viewModel) 

은 양식 컬렉션 값 model:"IBM 4846E65"이 포함되어 있다는 것입니다. 그런 다음 DefaultModelBindermodel이라는 속성을 찾아 값을 설정합니다. 이 매개 변수를 찾으면 매개 변수를 찾은 다음에 물론 CashRegisterViewModel model = "IBM 4846E65";을 시도합니다 (복잡한 객체에 문자열을 할당 할 수 없음). 그러면 바인딩이 실패합니다 (모델이 null)

+0

와우. 알지 못 했어. 고맙습니다! – Lorenzo