2011-01-30 13 views
10

मैं एएसपीएनटी एमवीसी 3, डेटा एनोटेशन और ऑटो मैपर का उपयोग कर रहा हूं।एक दृश्य मॉडल में सूची कैसे करें? + dataannotations

गुणों के सत्यापन के बाद मैं अपने दृश्य मॉडल में गुणों पर अपनी सभी टिप्पणियां रखना चाहता हूं, मैं इसे अपने डोमेन ऑब्जेक्ट पर वापस मैप करने के लिए ऑटो मैपर का उपयोग करता हूं।

मेरे पास एक व्यूमोडेल है जिसमें गुण हैं जिन्हें मैं संग्रह करना चाहता हूं क्योंकि मैं उनसे एक टेबल जेनरेट करना चाहता हूं। मैं बाद में इन तालिकाओं में पंक्तियों को जोड़ने के लिए एक रूप के रूप में उपयोग करने के लिए उनका उपयोग करना चाहता हूं।

तो मैं क्या करूँ? मैं इन गुणों को कैसे ले सकता हूं और उनका संग्रह कैसे करूं?

public class UserViewModel() 
{ 
    [Required()] 
    public string UserName = {get; set;} 
    [Required()] 
    public string FirstName = {get; set;} 
    [Required()] 
    public string LastName = {get; set;} 
} 

मैं इन गुणों का उपयोग अपनी तालिका उत्पन्न करने और एक रूप के लिए उपयोग करने के लिए करना चाहता हूं।

केवल एक चीज मैं के बारे में सोच सकते हैं कि इस

public class AddUserViewModel() 
    { 
     [Required()] 
     public string UserName = {get; set;} 
     [Required()] 
     public string FirstName = {get; set;} 
     [Required()] 
     public string LastName = {get; set;} 
    } 

    public class UserViewModel() 
    { 
     public List<User> Users {get; set;} 
     public AddUserViewModel {get; set;} 

     public UserViewModel() 
     { 
      Users = new List<Users>(); 
     } 
    } 

तो बुनियादी तौर पर मैं तो संभवत: अन्य viewmodel कि उपयोगकर्ता की सूची शामिल है में संलग्न है (मेरे डोमेन मॉडल)

एक अलग दृश्य मॉडल के रूप में है क्या कर रहा है

इस तरह से मैं उपयोगकर्ताओं को जोड़ने के लिए तालिका और मेरे AddUserViewModel उत्पन्न करने के लिए अपने डोमेन मॉडल का उपयोग करता हूं।

थोड़े अनावश्यक लगता है इसलिए मुझे यकीन नहीं है कि कोई बेहतर तरीका है या नहीं।

संपादित

मैं इस

var viewModel = new UserViewModel(); 
List<Users> users= UserService.GetAllUsers(); 
viewModel = Mapper.Map<Users, UserViewModel>(users); 
return View("Index", viewModel); 

की तरह कुछ मैं भी

var viewModel = new UserViewModel(); 
List<Users> users= UserService.GetAllUsers(); 
viewModel.AddUserViewModel = Mapper.Map<Users, AddUserViewModel>(users); 
return View("Index", viewModel); 

संपादित 2

की कोशिश की है कि मैं इस है और यह लेकिन संकलित मैं यह त्रुटि

 SomeViewModel viewModel = new SomeViewModel();  
     List<User> users= userService.GetAllUsers(); 
     viewModel.UserViewModel = Mapper.Map<List<User>, List<UserViewModel>>(users); 
     return View("Index", viewModel); 


Trying to map Domain.User to ViewModels.UserViewModel. 
Missing type map configuration or unsupported mapping. 
Exception of type 'AutoMapper.AutoMapperMappingException' was thrown. 
+0

मैं पूरी तरह से आपके प्रश्न को नहीं समझता और न ही आप जो हासिल करने की कोशिश कर रहे हैं। –

+0

@ डारिन डिमिट्रोव - हां जो एक टाइपो था। अब यह सही है। मैं यह समझने की कोशिश कर रहा हूं कि मैं दृश्य मॉडल में डेटा एनोटेशन का उपयोग कैसे कर सकता हूं लेकिन कोड को डुप्लिकेट किए बिना संभवतः मेरे डोमेन ऑब्जेक्ट्स की एक सूची भी वापस कर सकता हूं। अभी उपयोगकर्ता ऑब्जेक्ट में सब कुछ मूल रूप से AddUserViewModel() में एक डुप्लिकेट है। मैं एनोटेशन को डोमेन ऑब्जेक्ट में डाल सकता हूं लेकिन मैं ऐसा नहीं करना चाहता हूं। – chobo2

उत्तर

16

आप अपना दृश्य मॉडल में डोमेन वस्तुओं की एक सूची वापस जाने के लिए क्यों चाहेगा मिल सकता है? यह नहीं है कि मॉडल क्या होना चाहिए। मॉडल देखें केवल अन्य दृश्य मॉडल संदर्भित करना चाहिए। तो आपके पास एक अच्छा UserViewModel है जो उपयोगकर्ता का प्रतिनिधित्व करता है। अब आप अपने दृश्य में एकाधिक उपयोगकर्ताओं के साथ काम करने की जरूरत है, तो या तो आप एक IEnumerable<UserViewModel> या अगर आप कुछ अन्य संपत्तियों की जरूरत है तो आप इस के लिए एक दृश्य के मॉडल डिजाइन पारित:

public class UserViewModel 
{ 
    [Required] 
    public string UserName = { get; set; } 
    [Required] 
    public string FirstName = { get; set; } 
    [Required] 
    public string LastName = { get; set; } 
} 

public class SomeViewModel 
{ 
    public List<UserViewModel> Users { get; set; } 
    public string SomeOtherProperty { get; set; } 
} 

है और अब अपने नियंत्रक कार्रवाई इस प्रकार दिखाई देंगे:

public ActionResult Foo() 
{ 
    SomeModel model = _repository.GetModel(); 
    SomeViewModel viewModel = Mapper.Map<SomeModel, SomeViewModel>(model); 
    return View(viewModel); 
} 

अब आपके विचार के अंदर आप बस एक प्रदर्शन टेम्पलेट इस Users संपत्ति (Html.DisplayFor(x => x.Users)) के लिए उनमें से एक सूची दिखाने के लिए इस्तेमाल कर सकते हैं।


अद्यतन:

public ActionResult Foo() 
{ 
    IEnumerable<Users> users = _repository.GetUsers(); 
    IEnumerable<UserViewModel> usersViewModel = Mapper 
     .Map<IEnumerable<Users>, IEnumerable<UserViewModel>>(users); 
    return View(usersViewModel); 
} 

मैं भी एक sample project में एक AutoMap विशेषता का उपयोग किया है जो आपके कोड को आसान बनाने में कर सकते हैं:

है अच्छी प्रथाओं के मामले में आगे बढ़ने के लिए कैसे यहाँ अद्यतन देखने के बाद यह करने के लिए:

[AutoMap(typeof(IEnumerable<Users>), typeof(IEnumerable<UserViewModel>))] 
public ActionResult Foo() 
{ 
    IEnumerable<Users> users = _repository.GetUsers(); 
    return View(users); 
} 

यह विशेषता वाई स्वचालित रूप से नियंत्रक कार्रवाई के बाद चलाएगा और दृश्य प्रस्तुत करने से पहले और मॉडल को प्रति दृश्य मॉडल के साथ बदलने के लिए ऑटोमैपर का उपयोग करेगा।

+0

@ डारिन डिमिट्रोव - हम्म मैंने सोचा कि दृश्य मॉडल का संग्रह करना बुरा था। यह निर्धारित करना मुश्किल है कि इस ट्यूटोरियल में सही तरीका क्या है http://stephenwalther.com/blog/archive/2009/04/13/asp.net-mvc-tip-50-ndash-create-view-models .aspx वह मेरे पास – chobo2

+0

@ chobo2 का प्रकार कर रहा है, नहीं, दृश्य मॉडल के संग्रह के लिए बिल्कुल बुरा व्यवहार नहीं है। उदाहरण जिसका आप उल्लेख कर रहे हैं 'IENumerable ' का उपयोग करता है जो कि मैंने आपके उत्तर के पहले भाग में आपको वही सुझाव दिया है: 'IENumerable '। इस उदाहरण में 'उत्पाद' को एक दृश्य मॉडल के रूप में माना जाना चाहिए। इसके अलावा आपको अपने विचारों में 'foreach' loops लिखने से बचना चाहिए। आपको प्रदर्शन/संपादक टेम्पलेट का उपयोग करना चाहिए। यह आपके कोड को और अधिक संक्षिप्त बना देगा। इसलिए आप आसानी से ब्लॉग पोस्ट में दिखाए गए फ़ोरैच को एक पंक्ति में आसानी से प्रतिस्थापित कर सकते हैं: 'Html.DisplayFor (x => x.Products) '। –

+0

@ डारिन डिमिट्रोव - लेकिन क्या यह उनका डोमेन ऑब्जेक्ट नहीं है? मेरा मतलब है कि आप मेरे व्यूमोडेल (उपयोगकर्ता) से जो कहा है, उस पर विचार कर सकते हैं। मुझे लगता है कि डायप्ले/एडिटर टेम्पलेट्स एक नया सवाल है क्योंकि मैं हमेशा foreach का उपयोग करता हूं। – chobo2

संबंधित मुद्दे