2009-11-01 2 views
0

에서 통해 오는되지 않음 :일부 필드 다음은 내 컨트롤러 코드입니다 ModelBinder를

[AcceptVerbs(HttpVerbs.Post)] 
    public ActionResult Edit(int id, Actor actor) 
    { 

     try 
     { 
      actorRepository.Save(actor); 
      return RedirectToAction("Index"); 
     } 
     catch 
     { 
      return View("Edit"); 
     } 
    } 

강하게 액터 클래스에 입력되는 부분도있다 호출하는보기. 어떤 이유로 클래스에 바인딩되지 않는 몇 가지 필드가 있습니다. 해당 필드는 Address, Address2 및 ZipCode입니다. 그것들은 페이지에 채워지지만 null로 되돌아옵니다. 다른 모든 분야가 있습니다.

아이디어가 있으십니까? 또한이 동작을 복제하기 위해 어떻게 단위 테스트를 작성할 수 있습니까?

업데이트 공용 클래스 배우 { 공공 문자열 가운데 이름 {얻을; 설정;}

[Required(ErrorMessage = "First Name is Required")] 
    [RegularExpression(@"\w*", ErrorMessage = "Last Name Contains Illegal Characters")] 
    public string FirstName { get; set; } 

    [Required(ErrorMessage = "Last Name is Required")] 
    [RegularExpression(@"\w*", ErrorMessage = "Last Name Contains Illegal Characters")] 
    public string LastName { get; set; } 

    [DataType(DataType.PhoneNumber, ErrorMessage = "Please Enter a Valid Phone Number")] 
    [Required(ErrorMessage = "Phone Number is Required")] 
    public string PhoneNumber { get; set; } 

    [Required(ErrorMessage = "Address is Required")] 
    [RegularExpression(@"\w*", ErrorMessage = "Address Contains Illegal Characters")] 
    public string Address { get; set; } 

    [RegularExpression(@"\w*", ErrorMessage = "Address2 Contains Illegal Characters")] 
    public string Address2 { get; set; } 

    [RegularExpression(@"\w*",ErrorMessage = "State Contains Illegal Characters")] 
    [Required(ErrorMessage = "State is Required")] 
    public string State { get; set; } 

    [Required(ErrorMessage = "Zip Code is Required")] 
    [RegularExpression("\b[0-9]{5}(?:-[0-9]{4})?\b",ErrorMessage = "Please Enter a Valid Zip Code")] 
    public string ZipCode { get; set; } 

    [Required(ErrorMessage = "Even in theater, you have to choose a gender")] 
    public bool? Gender { get; set; } 

    [Required(ErrorMessage = "Cell Phone Number is Required")] 
    public string CellPhone { get; set; } 

    public int ActorId { get; set; } 

    [DataType(DataType.MultilineText, ErrorMessage = "Illegal Characters in Notes")] 
    public string Notes { get; set; } 

    [Required(ErrorMessage = "Email Address is Required")] 
    [DataType(DataType.EmailAddress)] 
    public string EMail { get; set; } 

    [Required(ErrorMessage = "City Is Required")] 
    public string City {get; set;} 
} 

<fieldset> 
<legend>Fields</legend> 
<p> 
    <label for="MiddleName">MiddleName:</label> 
    <%= Html.EditorFor(m=>m.MiddleName) %> 
    <%= Html.ValidationMessage("MiddleName", "*") %> 
</p> 
<p> 
    <label for="FirstName">FirstName:</label> 
    <%=Html.EditorFor(m=>m.FirstName) %> 
    <%= Html.ValidationMessage("FirstName", "*") %> 
</p> 
<p> 
    <label for="LastName">LastName:</label> 
    <%= Html.TextBox("LastName", Model.LastName) %> 
    <%= Html.ValidationMessage("LastName", "*") %> 
</p> 
<p> 
    <label for="PhoneNumber">PhoneNumber:</label> 
    <%= Html.TextBox("PhoneNumber", Model.PhoneNumber) %> 
    <%= Html.ValidationMessage("PhoneNumber", "*") %> 
</p> 
<p> 
    <label for="Address">Address:</label> 
     <%=Html.EditorFor(m=>m.Address) %> 
     <%= Html.ValidationMessage("Address", "*") %> 
</p> 
<p> 
    <label for="Address2">Address2:</label> 
     <%=Html.EditorFor(m=>m.Address2) %> 
    <%= Html.ValidationMessage("Address2", "*") %> 
</p> 
<p> 
    <label for="State">State:</label> 
    <%= Html.TextBox("State", Model.State) %> 
    <%= Html.ValidationMessage("State", "*") %> 
</p> 
<p> 
    <label for="ZipCode">ZipCode:</label> 
    <%= Html.TextBox("ZipCode", Model.ZipCode) %> 
    <%= Html.ValidationMessage("ZipCode", "*") %> 
</p> 
<p> 
    <label for="Gender">Gender:</label> 
    <%= Html.TextBox("Gender", Model.Gender) %> 
    <%= Html.ValidationMessage("Gender", "*") %> 
</p> 
<p> 
    <label for="CellPhone">CellPhone:</label> 
    <%= Html.TextBox("CellPhone", Model.CellPhone) %> 
    <%= Html.ValidationMessage("CellPhone", "*") %> 
</p> 
<p> 
    <label for="ActorId">ActorId:</label> 
    <%= Html.TextBox("ActorId", Model.ActorId) %> 
    <%= Html.ValidationMessage("ActorId", "*") %> 
</p> 
<p> 
    <label for="Notes">Notes:</label> 
    <%= Html.TextBox("Notes", Model.Notes) %> 
    <%= Html.ValidationMessage("Notes", "*") %> 
</p> 
<p> 
    <label for="EMail">EMail:</label> 
    <%= Html.TextBox("EMail", Model.EMail) %> 
    <%= Html.ValidationMessage("EMail", "*") %> 
</p> 
<p> 
    <label for="City">City:</label> 
    <%= Html.TextBox("City", Model.City) %> 
    <%= Html.ValidationMessage("City", "*") %> 
</p> 
<p> 
    <input type="submit" value="Save" /> 
</p> 
</fieldset> 
+0

보기 및 액터 객체 정의를 나열 할 수 있습니까? – Rudy

+0

예, Actor는 POCO 클래스이며보기에 이국적인 것이 없습니다 (어쨌든 알고 있습니다). – KevDog

답변

0

가 여기에 모델 바인더를 테스트하는 방법은 다음과 같습니다

How to test custom Model Binders in ASP.NET MVC?

만 당신은 DefaultModelBinder을 테스트합니다.

필드의 경우 배우 소스 코드가 표시되지 않았습니다. 하지만 필드 인에 대해 이야기 했으므로 필드를 실제로 사용한다고 추측 할 수 있습니다.하지만 ASP.NET MVC 모델 바인더는 속성에만 바인딩됩니다. 그래서 당신은

public class Actor 
{ 
    public string ZipCode; 
} 

이있는 경우 또 다른 이유는 당신이

public class Actor 
{ 
    public Address Address { get; set; } 
} 

이 있고 주소를 표시하는 부분 사용하는 것이 될 수있다

public class Actor 
{ 
    public string ZipCode { get; set; } 
} 

로 변경해야합니다; 따라서 "ZipCode"라는 이름이 붙지 만 "Address.ZipCode"라는 이름을 가져야합니다. 아니면 주소에 매개 변수없는 생성자가없는 것입니다. 다른 말로하면 소스 코드를 보지 않고도 추측 할 수없는 부분이 있습니다.

업데이트 정보는 의미가 아닙니다. 나쁜 필드는 좋은 필드와 같습니다. 그러나 EditorFor 대신 Html.TextBox를 사용해보십시오. FireBug (또는 IE Dev)를 사용하여 POST 데이터를 살펴보고 필드 이름과 값이 올바르게 올 수 있는지 확인하십시오. 그들은 문제가 모델 바인더와 함께, 만약 그들이 나쁜/결석 - 페이지에 뭔가 잘못 됐어. 또한 컨트롤러 동작에서 ModelState.IsValid와 ModelState 오류를 확인하십시오.

+0

저는 자동 속성을 사용하고 있습니다. 자동 속성은 구현 측면의 필드에 대한 구문 설탕입니다. 잠깐 와서 더 많은 것을 올렸습니다. 게시물을 작성했을 때 매우 늦었고 게시 코드를 보관할 두뇌가 없었습니다. – KevDog

+0

필드는 원래 Html.TextBox 였고, 나는 그것을 EditorFor로 바꾸어서 차이가 나는지 확인했습니다. 그것은 두 가지 방법을 사용하여 페이지에서 똑같이 렌더링되기 때문에 그 사실을 거의 배제하고 있습니다. 확인, Add 메서드에 대한 강력한 형식의 새보기를 만들고 동일한 필드에 동일한 오류가 발생했습니다. 조금 더 깊이 파고 들어갈 시간입니다. – KevDog

2

ASP.MVC의 DefaultModelBinder 클래스에서 빈 문자열을 NULL로 변환하는 ConvertEmptyStringsToNull (기본값 = true)이라는 ModelMetaData 속성이 있습니다.

[DisplayFormat(ConvertEmptyStringToNull=false)] 

또는 당신은 당신의 자신의 ModelBinder를을 만들고 DefaultModelBinder에서 상속 그냥이 같은이 설정을 무시하도록 GetPropertyValue 메서드를 재정의 할 수 있습니다 :

이 같은 각 속성에 DataAnnotation을 통해 변경할 수 있습니다

ModelBinders.Binders.DefaultBinder = new Delphi.Mvc.KeepStringsBinder(); ModelBinders.Binders.Add (typeof (ObjectBase), 새 Delphi.Mvc.KeepStringsBinder());