2013-03-02 35 views
1

在MVC4應用程序中,我有一些繼承爲視圖模型的業務對象。我想在視圖模型中使用DataAnnotations,而不是在Business Object中指定它。那可能嗎。模型驗證與繼承自業務對象的視圖模型

Business Objects公司

public class Country 
    { 
     [Display(Name = "Country")] 
     public virtual int CountryId { get; set; } 
     public virtual string CountryName { get; set; } 
     public virtual string CountryCode { get; set; } 
    } 

    public class State : Country 
    { 
     [Display(Name = "State")] 
     public virtual int StateId { get; set; } 
     public virtual string StateName { get; set; } 
     public virtual string StateCode { get; set; } 
    } 

    public class City : State 
    { 
     public virtual int CityId { get; set; } 

     [Display(Name = "City")] 
     public virtual string CityName { get; set; } 
    } 

視圖模型

在這裏,在上面的代碼中,我使用了市物業數據註解。

  1. 這裏面臨的問題是,即使我沒有這個必需的註釋,表格得到國家和州的驗證,但沒有驗證城市名稱。
  2. 當我添加所需的註釋時,它仍然只得到國家和州的驗證,但不是城市名稱。

任何想法?

我查看

@using (Html.BeginForm(Actions.AddCity, Controllers.AdminUtility, FormMethod.Post)) 
{ 
    <div class="alert-error"> 
     @Html.ValidationSummary() 
    </div> 
    <div class="row-fluid"> 
     <fieldset class="form-horizontal"> 
      <legend class="header">Add City</legend> 
      <div class="control-group"> 
       @Html.LabelFor(m => m.City.CountryId, new { @class = "control-label" }) 
       <div class="controls"> 
        @Html.DropDownListFor(m => m.City.CountryId, new SelectList(Model.Countries, "CountryId", "CountryName"),"", new { @class = "chosen", data_placeholder = "Choose Country..." }) 
       </div> 
      </div> 
      <div class="control-group"> 
       @Html.LabelFor(m => m.City.StateId, new { @class = "control-label" }) 
       <div class="controls"> 
        @Html.DropDownListFor(m => m.City.StateId,new SelectList(Model.States, "StateId","StateName"), "",new { @class = "chosen", data_placeholder = "Choose State..." }) 
       </div> 
      </div> 
      <div class="control-group"> 
       @Html.LabelFor(m => m.City.CityName, new { @class = "control-label" }) 
       <div class="controls"> 
        @Html.TextBoxFor(m => m.City.CityName) 
       </div> 
      </div> 
      <div class="control-group"> 
       <div class="controls"> 
        <input type="submit" /> 
       </div> 
      </div> 
     </fieldset> 
    </div> 
} 

回答

1

您的驗證是說,類是必需的。你希望CityName是必需的,所以在你的場景中,不,你必須在域模型上指定屬性。

只是一個說明 - 我不認爲你的域模型非常清晰。城市,州和國家不相互繼承,它們只是相關的。一個國家在一個國家,它不是一個國家......此外,你應該總是驗證你的域對象,因爲它們可能來自多個來源。然後,您的ViewModel將具有特定於該視圖的附加驗證 - 也許它具有一些用於UI處理的附加數據,不需要將其傳遞到您的域,等等。