2012-06-10 14 views
6

पर जाना चाहिए मेरे पास एक एमवीसी ऐप है जहां मैं डेटाबेस से जानकारी के साथ एक ड्रॉपडाउन सूची प्रदर्शित करना चाहता हूं।एमवीसी जहां तर्क नियंत्रक या दृश्य मॉडल

ड्रॉपडाउन तालिका का उपयोग कर डेटाबेस कारों से जानकारी प्रदर्शित करेगा कार को बनाने का तरीका बनाएं।

तो मेरे विचार में मैं की तरह कुछ करना होगा:

@model VectorCheck.ViewModels.CarsViewModel 
... 

@Html.DropDownListFor(modelItem => Model.MakeId, Model.Makes) 
... 

तो किसी भी तरह मैं दृश्य मॉडल बनाता है की सूची प्राप्त करने की जरूरत है।

तो मुझे इसके साथ जाने के लिए कुछ तर्क हो सकता है कि केवल लाल रंग वाली कारें हों।

var redCars = _unitOfWork.Cars(x => x.Colour == "Red"); 

तो मेरा सवाल यह है कि इस क्वेरी के लिए तर्क डालने का सबसे अच्छा अभ्यास कहां है। इसे मॉडल या नियंत्रक के दृश्य में जाना चाहिए।

जिस तरह से मैं इसे देखता हूं मेरे पास दो विकल्प हैं।

विकल्प 1: नियंत्रक।

public ActionResult Edit(int id) 
     { 
      var car = _unitOfWork.CarRepository.Get(id); 

      var carMakes = _unitOfWork.CarMakeRepository.Where(x => x.Colour == "Red").Select(u => new SelectListItem { Value = u.CarMakeId.ToString(), Text = u.Name }); 

      return View("Edit", new InsertUpdateCarViewModel(car, carMakes)); 
     } 

ViewModel

public Car Car { get; set; } 
public IEnumerable<SelectListItem> CarMakes { get; set; } 

InsertUpdateCarViewModel(Car car, IEnumerable<SelectListItem> carMakes) 
{ 
    Car= car; 
    CarMakes = carMakes; 

} 

तो इस उदाहरण में मैं नियंत्रक में carMakes और उन्हें ViewModel जो केवल एक कंटेनर है दे।

Opon 2: ViewModel

public ActionResult Edit(int id) 
     { 
      var car = _unitOfWork.CarRepository.Get(id); 

      return View("Edit", new InsertUpdateCarViewModel(car)); 
     } 

ViewModel

public Car Car { get; set; } 
public IEnumerable<SelectListItem> CarMakes { get; set; } 

InsertUpdateCarViewModel(Car car) 
{ 
    Car= car; 

    CarMakes = _unitOfWork.CarMakeRepository.Where(x => x.Colour == "Red").Select(u => new SelectListItem { Value = u.CarMakeId.ToString(), Text = u.Name }); 

} 

तो इस विकल्प में मैं तर्क डाल रहा हूं दृश्य मॉडल में सही carmakes मिलता है। यह एक कंटेनर से अधिक है।

तो मैं क्या जानना चाहता हूं कि इन तरीकों में से कौन सा तरीका ऐसा करने का सही तरीका है?

उत्तर

3

नियंत्रक में। ViewModel को आपके द्वारा उपयोग किए जा रहे काम की इकाई से अवगत नहीं होना चाहिए। साथ ही, इस मामले में दृश्य मॉडल बहुत अधिक पुन: प्रयोज्य होगा यदि इसे तर्क x => x.Colour == "Red" पर भरोसा नहीं करना पड़ेगा। भले ही इसे तर्कों में स्थानांतरित किया जा सके, आम तौर पर, मेरा मानना ​​है कि आपके मॉडल (और विचारों के लिए) नियंत्रक में इसकी देखभाल करने के लिए बहुत अधिक पुन: प्रयोज्य होगा।

0

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

0

कोई भी जवाब बहुत ही व्यक्तिपरक होगा लेकिन मैं सुझाव दूंगा कि आपके दृश्य मॉडल के भीतर _unitOfWork संदर्भ (या किसी भी निर्भरता को इंजेक्शन की आवश्यकता है) होने के बजाय चिंताओं का हिंसक पृथक्करण।

इसे नियंत्रक में रखें - दूर क्लीनर।

3

जैसा कि पहले से ही उत्तर दिया गया है, यह नियंत्रक है। इसे आपके लिए और अधिक यादगार बनाने के लिए, मैं इसे इस तरह से रखूंगा। अपने विचार को डेटाबेस से सीधे बात न करने दें। केवल नियंत्रक को पूछता/वार्ता देखें। फिर स्पष्ट रूप से यह देखने के लिए समझ में आता है कि नियंत्रक को अनुरोध भेजना जो इसे डेटाबेस के आगे भेजता है। उम्मीद है कि यह भविष्य के लिए मदद करता है!

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