2014-02-07 80 views
0

我使用MVC 5與EntityFramework,我似乎無法使用數據註釋使相關對象的選擇一個必填字段。如何製作相關對象?

我的模型很簡單。這裏是我的Movement.cs模型:

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

} 

該運動有2個相關的實體,人員和位置是非常簡單的墨比爾。在我創建運動形式我用下面的視圖模型:

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

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

} 

這是我的控制器:

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())); 
    } 

最後我創造觀點對我相關實體如下:

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

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

如果我提交表單,然後我得到驗證錯誤,我的人員和位置字段是必需的...但是當我從下拉列表中選擇一個條目並嘗試重新提交時,表單仍然會引發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屬性,因爲無論如何似乎都沒有被使用。你應該確認移動到您的視圖模型類,而不是:

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

} 

正如上面介紹你不能使用Nullable<int>int?),你應該使用非空的整數(int)適當地得到驗證工作。

+0

好吧,這很有意義,謝謝。但是,我反而將[必需的]標記移動到ViewModel中的SelectedPerson和SelectedLocation屬性,然後驗證不會觸發 – Evonet

+0

啊,將空值更改爲是修復它的另一部分,謝謝! – Evonet