2012-03-27 31 views
18

Entity Framework 4.1 ile bir ASP.Net MVC 3 Web uygulaması geliştiriyorum ve form doğrulama için Veri Ek Açıklamalarını kullanma konusunda biraz kafa karıştırıyorum. Her zaman bir ViewModel'i gerçek nesnenin geçirilmesinin aksine bir Görünüm'e döndürüyorum. Örneğin:ASP.Net MVC 3 ViewModel Veri Açıklaması

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

Benim Görünüm sonra bu Görünümü doğrulamak için bu

@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> 

gibi bir şey olabilir, ben o zaman

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

Ve benzeri kısmi sınıfta Veri Ek Açıklamalar yarattık Oluşturma Denetleyicim'de bu

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

Şimdi, bu iyi çalışıyor, ancak ViewModels ve doğrulama hakkında daha fazla okudum, doğrulanması gereken ViewModel olduğu görünüyor, çünkü günün sonunda, görüntüleniyor ViewModel olduğunu Görünüm, nesne değil.

Bu nedenle, aşağıdaki

public class ViewModelListItem 
{ 

    public int teamID { get; set; } 

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

gibi görünmek benim ViewModel değişti Ve ayrıca Yine bu

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

benim oluşturmak Kontrolörü değişti, bu işleri, ama sadece duygu olsun 2. yöntem, bunu yapmanın ilk yolunda biraz dağınık veya verimli değil.

Bu konuda başkalarının düşüncelerini duymak isterim. Yardımlarınız için teşekkür ederim ve bu kadar uzun bir yazı için özür dilerim.

cevap

11

Etki alanı ve görünüm modelleri arasındaki eşlemeyi basitleştirmeme yardımcı olmak için her zaman görünüm modellerini ve AutoMapper modellerini kullanırım.

görünümü modeli: o zaman

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

ve yaygın olarak kullanılan bir model:

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

Ya ViewModel başarısız oluşturursanız oluşturun Kontrolör içinde 30 özelliklerini söylemek vardı bir nesne temsil eğer, Sonra her özelliği tekrar ViewModel'e atamak zorunda kalırdım, yani viewModel.property1 = team.prop1, viewModel.property2 = team.prop2, viewModel.property3 = team.prop3 ... viewModel.property30 = team.prop30 vb. Bu verimsiz görünüyor, ama AutoMapper'ın yaptığı şey nedir? Daha önce hiç kullanmadım. – tgriffiths

+0

Bu, bir sürü anlam ifade ediyor. Mükemmel cevap. Teşekkür ederim. – tgriffiths

+0

Paylaşım için teşekkürler Darin Dimitrov. Sadece bir soru, sen sadece ViewModel üzerinde DataAnnoration kullanıyorsun ve asla Modelde değilsin? Bu http://forums.asp.net/t/1502378.aspx – GibboK