18

Ich entwickle eine ASP.Net MVC 3 Web-Anwendung mit Entity Framework 4.1 und ich bin ein wenig verwirrt in Bezug auf die Verwendung von Data Annotations für die Formularvalidierung. Ich gebe immer ein ViewModel zu einer Ansicht zurück, anstatt das tatsächliche Objekt zu übergeben, da ich weiß, dass dies eine schlechte Übung ist. Zum Beispiel:ASP.Net MVC 3 ViewModel Daten Anmerkungen

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

Meine Ansicht könnte dann so etwas wie diese, diese Ansicht zu bestätigen

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

hat, ich habe in einem Teilklasse-Data Annotations wie so

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

erstellt und dann in meinem create Controller habe ich diese

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

Nun, das funktioniert gut, aber je mehr ich über ViewModels und Validierung lese, desto mehr scheint es, dass es das ViewModel ist, das validiert werden sollte, denn am Ende des Tages wird das ViewModel angezeigt die Ansicht, nicht das Objekt.

Deshalb habe ich meine Ansichtsmodell geändert wie folgt

public class ViewModelListItem 
{ 

    public int teamID { get; set; } 

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

zu suchen und ich änderte auch meine schaffen Controller zu diesem

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

Auch dies funktioniert, aber ich habe einfach das Gefühl der 2. Methode ist ein bisschen chaotisch oder nicht so effizient auf die erste Weise, dies zu tun.

Ich wäre daran interessiert, die Gedanken anderer Leute zu diesem Thema zu hören. Danke für Ihre Hilfe und ich entschuldige mich für einen so langen Post.

Antwort

11

Ich verwende immer Ansichtsmodelle und AutoMapper, um mir zu helfen, die Zuordnung zwischen meiner Domäne und Ansichtsmodellen zu vereinfachen.

Ansicht Modell:

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

und dann ein häufig verwendetes Muster:

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

Was passiert, wenn mein Viewmodel ein Objekt repräsentiert, die 30 Objekte sagen hatten, in der Steuerung erstellen, wenn das nicht schaffen, müsste ich dann jede Eigenschaft wieder dem ViewModel zuweisen, dh, viewModel.property1 = team.prop1, viewModel.property2 = team.prop2, viewModel.property3 = team.prop3 ... viewModel.property30 = team.prop30 usw. Das scheint ineffizient, aber vielleicht macht das AutoMapper? Ich habe es noch nie zuvor benutzt. – tgriffiths

+0

Das macht viel Sinn. Gute Antwort. Vielen Dank. – tgriffiths

+0

Danke Darin Dimitrov zum Teilen. Nur eine Frage, also verwenden Sie nur DataAnnovation auf Ihrem ViewModel und niemals auf dem Model? Werfen Sie einen Blick auf diese http://forums.asp.net/t/1502378.aspx – GibboK