2012-03-27 158 views
18

我正在用Entity Framework 4.1開發ASP.Net MVC 3 Web應用程序,我對使用數據註釋進行表單驗證感到有點困惑。 我總是返回一個ViewModel到視圖,而不是傳遞實際的對象,因爲我意識到這是不好的做法。例如:ASP.Net MVC 3 ViewModel數據註釋

public class ViewModelTeam 
{ 
    public Team Team { get; set; } 
} 

我的觀點可能會再有這樣的事情

@model UI.ViewModels.ViewModelTeam 

    @Html.HiddenFor(model => model.Team.teamID) 


    <div class="editor-label"> 
     @Html.LabelFor(model => model.Team.description) 
    </div> 
    <div class="editor-field"> 
     @Html.EditorFor(model => model.Team.description) 
     @Html.ValidationMessageFor(model => model.Team.description) 
    </div> 

爲了驗證這一觀點,我已經創建了數據註釋在部分類像這樣

[MetadataType(typeof(TeamMetaData))] 
public partial class Team 
{ 
    public class TeamMetaData 
    { 
     [DisplayName("Team Name")] 
     [Required(ErrorMessage = "Please enter a Team Name")] 
     public object description { get; set; } 

然後在我創建控制器我有這個

[HttpPost] 
    public ActionResult Create(Team team) 
    { 
     if (ModelState.IsValid) 
     { 
      //Add team and redirect 
     } 

      //Got this far then errors have happened 
      //Add Model State Errors 


     ViewModelTeam viewModel = new ViewModelTeam 
     { 
      Team = team    
     }; 

     return View(viewModel); 
    } 

現在,這工作得很好,但是,我對ViewModels和驗證的瞭解越多,看起來應該驗證的ViewModel越多,因爲在一天結束時,ViewModel顯示在視圖,而不是對象。

因此,我改變了我的視圖模型看起來像下面

public class ViewModelListItem 
{ 

    public int teamID { get; set; } 

    [DisplayName("Item Name")] 
    [Required(ErrorMessage = "Please enter a Team Name")] 
    public string description { get; set; } 

而且我也改變了我的創建控制器添加到該

[HttpPost] 
    public ActionResult Create(Team team) 
    { 
     if (ModelState.IsValid) 
     { 
      //Add team and redirect 
     } 

      //Got this far then errors have happened 
      //Add Model State Errors 

     ViewModelTeam viewModel = new ViewModelTeam(); 
    viewModel.description = team.description; 

     return View(viewModel); 
    } 

再次,這工作,但我剛剛得到的感覺第二種方法在做這件事的第一種方式上有點麻煩或者效率不高。

我希望聽到別人對此的想法。感謝您的幫助,我爲這麼長的帖子道歉。

回答

11

我總是使用視圖模型和AutoMapper來幫助我簡化我的域和視圖模型之間的映射。

視圖模型:

public class TeamViewModel 
{ 
    [DisplayName("Team Name")] 
    [Required(ErrorMessage = "Please enter a Team Name")] 
    public string Description { get; set; } 
} 

,然後一個常用模式:

public class TeamsController: Controller 
{ 
    public ActionResult Create() 
    { 
     var model = new TeamViewModel(); 
     return View(model); 
    } 

    [HttpPost] 
    public ActionResult Create(TeamViewModel model) 
    { 
     if (!ModelState.IsValid) 
     { 
      return View(model); 
     } 

     Team team = Mapper.Map<TeamViewModel, Team>(model); 
     Repository.DoSomethingWithTeam(team); 

     return RedirectToAction("Success"); 
    } 
} 
+0

如果我的視圖模型來表示其中有說30個樓盤中,創建控制器內,如果創建失敗的對象,然後我必須將每個屬性分配回ViewModel,即viewModel.property1 = team.prop1,viewModel.property2 = team.prop2,viewModel.property3 = team.prop3 ... viewModel.property30 = team.prop30等這看起來效率不高,但也許這就是AutoMapper所做的事情?我從來沒有用過它。 – tgriffiths 2012-03-27 14:06:13

+0

這很有意義。很好的答案。謝謝。 – tgriffiths 2012-03-27 14:09:37

+0

感謝Darin Dimitrov分享。只是一個問題,所以你只使用ViewModel上的DataAnnoration,而不使用Model?看看這個http://forums.asp.net/t/1502378.aspx – GibboK 2012-06-29 07:20:51