2012-03-27 17 views
18

मैं एंटिटी फ्रेमवर्क 4.1 के साथ एक एएसपी.NET एमवीसी 3 वेब एप्लिकेशन विकसित कर रहा हूं और मुझे फॉर्म सत्यापन के लिए डेटा एनोटेशन का उपयोग करने के संबंध में थोड़ा उलझन में आ रहा है। मैं हमेशा वास्तविक दृश्य को पारित करने के विरोध में एक व्यूमोडेल को एक दृश्य में वापस लौटाता हूं क्योंकि मुझे एहसास है कि यह खराब अभ्यास है। उदाहरण के लिए:एएसपी.नेट एमवीसी 3 व्यूमोडेल डेटा एनोटेशन

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); 
    } 
है

अब, यह ठीक काम करता है, हालांकि, मैंने व्यूमोडल्स और सत्यापन के बारे में जितना अधिक पढ़ा है, उतना ही ऐसा लगता है कि यह व्यूमोडेल है जिसे सत्यापित किया जाना चाहिए, क्योंकि दिन के अंत में, यह व्यूमोडेल है जिसमें प्रदर्शित किया जा रहा है दृश्य, वस्तु नहीं।

इसलिए, मैं अपने 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

यदि मेरे ViewModel एक वस्तु जो था कहना 30 गुण, बनाने के नियंत्रक के अंदर है, अगर बनाने में विफल रहता है का प्रतिनिधित्व किया, तो मुझे प्रत्येक प्रॉपर्टी को ViewModel पर वापस सौंपना होगा, यानी viewModel.property1 = team.prop1, viewModel.property2 = team.prop2, viewModel.property3 = team.prop3 ... viewModel.property30 = team.prop30 इत्यादि। यह अक्षम लगता है, लेकिन हो सकता है कि ऑटोमैपर क्या करता है? मैंने पहले कभी इसका इस्तेमाल नहीं किया है। – tgriffiths

+0

यह बहुत समझ में आता है। बहुत बढ़िया जवाब। धन्यवाद। – tgriffiths

+0

साझा करने के लिए धन्यवाद डारिन डिमिट्रोव। बस एक सवाल है, तो आप केवल ViewAodnoration का उपयोग करते हैं ViewModel और मॉडल पर कभी नहीं? इस http://forums.asp.net/t/1502378.aspx – GibboK