2014-02-07 2 views
0

MVC 5를 EntityFramework와 함께 사용하고 있는데 Data Annotations를 사용하여 관련 객체를 필수 필드로 선택할 수없는 것처럼 보입니다.관련 개체를 만드는 방법은 무엇입니까?

내 모델은 매우 간단합니다. 움직임이 매우 간단 mobels있는 2 개 관련 기관, 사람 및 위치를 가지고

public class Movement 
{ 
    [Key] 
    public int MovementID { get; set; } 

    [Required(ErrorMessage = "Type is required.")] 
    [MaxLength(50, ErrorMessage = "Type cannot be longer than 50 characters.")] 
    public string Type { get; set; } 

    [Required(ErrorMessage = "Persons name is required.")] 
    public virtual Person Name { get; set; } 

    [Required(ErrorMessage = "Location is required.")] 
    public virtual Location Location { get; set; } 

} 

: 여기 내 Movement.cs 모델이다. 내 만들기 운동 양식에서 나는 다음 뷰 모델 사용

public class MovementFormViewModel 
{ 
    public Movement Movement { get; set; } 
    public IEnumerable<SelectListItem> Types { get; set; } 

    public int? SelectedLocation { get; set; } 
    public int? SelectedPerson { get; set; } 

} 

그리고 여기 내 컨트롤러 :

  @Html.DropDownListFor(
       x => x.SelectedPerson, 
       Model.People, 
       "-- Select a Person --") 

      <p class="text-error"> 
       @Html.ValidationMessageFor(model => model.MarketMovement.Name) 
      </p> 

경우 :

private MovementFormViewModel createViewModel(Movement movement) 
    { 
     var types = new[] 
      { 
       new SelectListItem{ Text="Transfer", Value = "Transfer" }, 
       new SelectListItem{ Text="Promotion", Value = "Promotion" }, 
       new SelectListItem{ Text="N/A", Value = "N/A" } 
      }; 

     var locations = db.Locations.ToArray().Select(x => new SelectListItem 
     { 
      Value = x.LocationID.ToString(), 
      Text = x.Name 
     }); 

     var people = db.People.ToArray().Select(x => new SelectListItem 
     { 
      Value = x.PersonID.ToString(), 
      Text = x.FullName 
     }); 

     MovementFormViewModel viewModel = new MovementFormViewModel 
     { 
      Movement = movement, 
      Types = types, 
      Locations = locations, 
      People = people 

     }; 

     return viewModel; 

    } 


    public ActionResult Create() 
    { 
     return View(createViewModel(new Movement())); 
    } 

마지막으로 뷰를 생성의 나

가 내 관련 기관에 대해 다음을 가지고 폼을 제출하면 Person 및 Location 필드가 필요하다는 유효성 검증 오류가 발생하지만 드롭 다운 목록에서 항목을 선택하고 다시 제출하려고하면 폼이 validat를 발생시킵니다 그 엔트리가 필요하고 계속 진행할 수 없다.

내가 뭘 잘못하고 있니?

답변

1

우선은 여기에 같은 비 기본 유형에 DataAnnotations 설정하는 것이 좋습니다되지 않은 : 당신의 이름 속성은 이름없는

[Required(ErrorMessage = "Persons name is required.")] 
public virtual Person Name { get; set; } 

[Required(ErrorMessage = "Location is required.")] 
public virtual Location Location { get; set; } 

사실 더 무엇을하지만, 전체 Person 객체.

일반적으로 중요한 문제는 항목을 선택할 때 MovementFormViewModel.Movement.Person에 바인딩되지 않지만 단순히 MovementFormViewModel.SelectedPerson을 설정한다는 사실에 있습니다. 따라서 MovementFormViewModel.Movement.Person은 비어 있고 유효성 검사 오류가 발생합니다.

따라서 Movement 클래스의 Required 특성은 사용하지 않는 것이므로 제거하는 것이 좋습니다. 대신 뷰 모델 클래스에 유효성 검사를 이동해야합니다 :

당신이 Nullable<int> ( int?)를 사용할 수 없습니다 위에 제시된
public class MovementFormViewModel 
{ 
    public Movement Movement { get; set; } 
    public IEnumerable<SelectListItem> Types { get; set; } 

    [Required(ErrorMessage = "Location is required.")] 
    public int SelectedLocation { get; set; } 
    [Required(ErrorMessage = "Persons name is required.")] 
    public int SelectedPerson { get; set; } 

} 

, 당신은 적절하게 검증 작업을 얻기 위해 비 - 널 (NULL)의 int (int)를 사용합니다.

+0

감사합니다. 감사합니다. 그러나 대신 ViewModel의 SelectedPerson 및 SelectedLocation 속성으로 [Required] 태그를 이동하여 유효성 검사가 트리거되지 않습니다 – Evonet

+0

Ahuch, nullable 으로 변경하면 감사하겠습니다! – Evonet

0

제출할 때 선택한 사람이 실제로 모델에 설정되어 있습니까? 동일한 작업을 위해 SelectedPersonID를 만들고 필요에 따라 표시했습니다. 여기에 설명 된 바와 같이

http://odetocode.com/blogs/scott/archive/2013/03/11/dropdownlistfor-with-asp-net-mvc.aspx

모든
+0

예, [필수] 태그를 제거하면 정상적으로 작동합니다. 대신 [Required] 태그를 ViewModel의 SelectedPerson 및 SelectedLocation 속성으로 이동하면 유효성 검사가 트리거되지 않습니다. – Evonet

관련 문제