2012-06-29 23 views
27

व्यूबैग के लिए, मैंने सुना है कि यह उपयोग करने के लिए नो-नो था। मुझे लगता है कि व्यूबैग की सामग्री को व्यू मॉडल में शामिल किया जाना चाहिए?एमवीसी व्यूबैग बेस्ट प्रैक्टिस

प्रश्न:

  1. सबसे अच्छा अभ्यास के ऊपर मेरी धारणा है। (दृश्य मॉडल में इसे देखने के लिए एक व्यूबैग और दूसरा उपयोग नहीं करना)

  2. क्या ऐसी स्थितियां हैं जहां व्यूबैग बिल्कुल जरूरी है?

+7

माइक्रोसॉफ्ट के परिप्रेक्ष्य से, हम कभी भी व्यूबैग या व्यूबैग का उपयोग करने के लिए सहमत नहीं हैं, मॉडल नंबर पास करने के लिए व्यूबैग का उपयोग करने वाला कोई नंबर नहीं है और इसे निराश किया जाना चाहिए। मेटा-डेटा (सूची का चयन करें) पास करने के लिए व्यूबैग का उपयोग करना ठीक है। सैंडर्सन और अन्य पुस्तकों द्वारा प्रो एमवीसी उनका उपयोग करते हैं और ऐसी कोई निश्चित घोषणा नहीं करते हैं - 2. एबीएस आवश्यक - मुझे शक है। – RickAndMSFT

उत्तर

25

व्यूबैग एक गतिशील शब्दकोश है। तो जब कार्य विधियों और विचारों के बीच डेटा स्थानांतरित करने के लिए व्यूबैग का उपयोग करते हैं, तो आपके कंपाइलर को आपके दृश्य में व्यूबैग आइटम तक पहुंचने का प्रयास करते समय आपके कोड में टाइपो बनाने में सक्षम नहीं होगा। आपका दृश्य रन टाइम पर क्रैश हो जाएगा :(

आम तौर पर आपके एक्शन विधियों और विचारों के बीच डेटा स्थानांतरित करने के लिए एक दृश्य मॉडल का उपयोग करना एक अच्छा विचार है। मॉडल देखें एक साधारण पीओसीओ वर्ग है जिसमें दृश्य के लिए विशिष्ट गुण हैं। यदि आप देखने के लिए कुछ अतिरिक्त डेटा पास करना चाहते हैं, तो अपने दृश्य मॉडल में एक नई संपत्ति जोड़ें और इसका उपयोग करें। सशक्त टाइप किए गए दृश्य कोड क्लीनर और बनाए रखने के लिए अधिक आसान बनाते हैं। इस दृष्टिकोण के साथ, आपको स्पष्ट कास्टिंग करने की आवश्यकता नहीं है आप दृश्य बैग के साथ क्या करना है जो कुछ प्रकार के आगे पीछे करने के लिए अपने viewbag शब्दकोश मद।

public class ProductsForCategoryVm 
{ 
    public string CategoryName { set;get; } 
    public List<ProductVm> Products { set;get;}  
} 
public class ProductVm 
{ 
    public int Id {set;get;} 
    public string Name { set;get;} 
} 

और अपनी कार्रवाई विधि में, इस दृश्य मॉडल की एक वस्तु बनाने के गुण लोड और देखने के लिए कि भेजें।

public ActionResult Category(int id) 
{ 
    var vm= new ProductsForCategoryVm(); 
    vm.CategoryName = "Books"; 
    vm.Products= new List<ProductVm> { 
    new ProductVm { Id=1, Name="The Pragmatic Programmer" }, 
    new ProductVm { Id=2, Name="Clean Code" } 
    } 
    return View(vm); 
} 

और आपके विचार, जो दृढ़ता से दृश्य मॉडल के लिए लिखा गया हो,

@model ProductsForCategoryVm 
<h2>@Model.CategoryName</h2> 
@foreach(var item in Model.Products) 
{ 
    <p>@item.Name</p> 
} 

ड्रापडाउन डेटा?

कई ट्यूटोरियल/पुस्तकों में कोड नमूने हैं जो ड्रॉपडाउन डेटा के लिए व्यूबैग का उपयोग करते हैं। मैं व्यक्तिगत रूप से अभी भी महसूस करता हूं कि इसके लिए व्यूबैग का उपयोग नहीं किया जाना चाहिए। ड्रॉपडाउन डेटा पास करने के लिए यह आपके व्यू मॉडल में List<SelectListItem> की एक संपत्ति होनी चाहिए। यहां एक post है उदाहरण के साथ कोड कैसे करें।

क्या ऐसी स्थितियां हैं जहां व्यूबैग बिल्कुल जरूरी है?

कुछ वैध उपयोग के मामलों जहां (आवश्यक नहीं) कर सकते हैं ViewBag का उपयोग डेटा भेजने के लिए कर रहे हैं। उदाहरण के लिए, आप अपने लेआउट पेज पर कुछ दिखाना चाहते हैं, इसके लिए आप व्यूबैग का उपयोग कर सकते हैं। एक और उदाहरण ViewBag.Title(पृष्ठ शीर्षक के लिए) डिफ़ॉल्ट एमवीसी टेम्पलेट में मौजूद है।

public ActionResult Create() 
{ 
    ViewBag.AnnouncementForEditors="Be careful"; 
    return View(); 
} 

और लेआउट में, आप ViewBags साथ ViewBag.AnnouncementForEditors

<body> 
<h1>@ViewBag.AnnouncementForEditors</h1> 
<div class="container body-content"> 
    @RenderBody() 
</div> 
</body> 
+0

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

0
  1. सं उपयोग ViewModels
  2. नहीं। यदि आप एक परिपूर्ण व्यूमोडेल डिज़ाइन करते हैं, तो आपको कभी भी व्यूबैग की आवश्यकता नहीं है।
4

1) क्या मेरी धारणा सर्वोत्तम अभ्यास से ऊपर है। (दृश्य मॉडल में इसे देखने के लिए व्यूबैग और सेकेंड का उपयोग न करें)

हां।

2) क्या ऐसी स्थितियां हैं जहां व्यूबैग बिल्कुल जरूरी है?

नहीं। व्यूबैग में आपके द्वारा संग्रहीत सब कुछ दृश्य दृश्य में जा सकता है।

+0

मेटा-डेटा के बारे में क्या? क्या हमें टेम्पलेट्स से @ व्यूबैग टिटल आउट करना चाहिए? – RickAndMSFT

+7

हाँ, इसे फेंक दो। कृप्या। मैं एएसपी.नेट एमवीसी 4 में नहीं देखना चाहता हूं। यह मुझे उल्टी करना चाहता है। फ्रेमवर्क में आंतरिक रूप से इसका इस्तेमाल करें यदि आप इसे 'आंतरिक' के रूप में चिह्नित करेंगे ताकि डेवलपर को इसके साथ कभी सामना नहीं करना पड़े। –

4

मुद्दा पढ़ सकते हैं और सिफारिश सबसे अच्छा अभ्यास पर निर्भर समय जाँच संकलित करने के लिए। व्यूबैग सिर्फ शब्दकोष हैं और इसके साथ आपको 'जादू' तार मिलते हैं, इसलिए यदि आप व्यूबैग आइटमों में से किसी एक ऑब्जेक्ट प्रकार को बदलना चाहते हैं या कुंजी नाम जिसे आप रनटाइम तक नहीं जानते हैं, भले ही आप <MvcBuildViews>true</MvcBuildViews> का उपयोग करके विचारों को प्रीकंपल करते हैं।

मॉडल देखने के लिए चिपकाना सबसे अच्छा है, भले ही आपको उन्हें एक विशिष्ट दृश्य को फिट करने के लिए बदलना पड़े।

26

1) क्या मेरी धारणा सर्वोत्तम अभ्यास से ऊपर है। (नहीं एक ViewBag और दूसरा उपयोग करने के लिए दृश्य मॉडल में पाना)

आप तक संभव हो, ViewBag के माध्यम से गुजर डेटा के बजाय ViewModels का उपयोग करना चाहिए।

2) क्या ऐसी स्थितियां हैं जहां व्यूबैग बिल्कुल जरूरी है?

कोई ऐसी स्थिति नहीं है जहां व्यूबैग बिल्कुल जरूरी है। हालांकि, कुछ डेटा हैं जिन्हें मैं व्यक्तिगत रूप से व्यू मॉडल के बजाय व्यूबैग का उपयोग करना पसंद करता हूं। उदाहरण के लिए, जब मुझे पूर्वनिर्धारित मानों (यानी शहरों) के लिए ड्रॉपडाउन बॉक्स को पॉप्युलेट करने की आवश्यकता होती है, तो मैं देखने के लिए SelectListItem सरणी ले जाने के लिए व्यूबैग का उपयोग करता हूं। मैं इस डेटा के साथ अपने व्यू मॉडल्स को प्रदूषित नहीं करना पसंद करता हूं।

+4

हमारे (एमएस) प्रकाशित मार्गदर्शन के साथ संरेखण में उत्कृष्ट प्रतिक्रिया। मैं इसे केवल डेटा डेटा पास करने के लिए डेटा पास करने से बदल दूंगा (मेटा-डेटा को छोड़कर) मेरे ट्यूटोरियल के नीचे देखें http://www.asp.net/mvc/tutorials/javascript/working-with-the-dropdownlist-box-and -jquery/examining-how-aspnet-mvc-scaffolds-the-dropdownlist-helper – RickAndMSFT

+0

@RickAndMSFT, मुझे व्यवस्थापक होना चाहिए जब मैंने पहली बार व्यूबैग सीखा तो मैंने आपकी पोस्ट का लाभ उठाया। वैसे बढ़िया पोस्ट। – SadullahCeran

+1

अच्छा जवाब, मुझे लगता है कि व्यूबैग का उपयोग करके दृश्यमान को प्रदूषित करने के विकल्पों को देखने के बजाय व्यूमोडल को प्रदूषित करना एक अच्छा अभ्यास है। यदि व्यूमोडेल में कोई सूची उत्तीर्ण की जाती है तो ऐसा इसलिए होता है क्योंकि सूची को संपादित करने की संभावना है या क्योंकि यह मॉडल के लिए "समझ में आता है"। लेकिन विकल्पों की एक सूची के मामले में जहां केवल एक ही चुना जाएगा, व्यूबैग क्लीनर लगता है। – iberodev

2

मुझे व्यूबैग के लिए कुछ उपयोग मिला है जहां सभी पृष्ठों पर सामान्य कार्यक्षमता है, और कार्यक्षमता दिखाए जा रहे पृष्ठ पर निर्भर नहीं है। उदाहरण के लिए, कहें कि आप स्टैक ओवरफ्लो बना रहे हैं। प्रत्येक पृष्ठ पर जॉब बोर्ड दिखाई देता है, लेकिन दिखाए गए नौकरियों के पास पृष्ठ से कोई लेना देना नहीं है (मेरा उपयोग अवधारणा में समान था)। प्रत्येक व्यूमोडेल में एक संपत्ति जोड़ना कठिन और समय लेने वाला होगा, और आपके परीक्षणों में लॉट होगा। मुझे नहीं लगता कि यह इस स्थिति में इसके लायक है।

मैंने क्रॉस कटिंग डेटा के साथ बेस व्यू मॉडेल क्लास का उपयोग किया है, लेकिन यदि आप एक से अधिक (उदाहरण के लिए, नौकरियां & स्टैक एक्सचेंज साइटों की सूची), तो आपको या तो अतिरिक्त डेटा भरना शुरू करना होगा, या किसी अन्य दुर्व्यवहार एक व्यूमोडेल, साथ ही आपको आधार डेटा को पॉप्युलेट करने के लिए व्यूमोडेल बिल्डर की आवश्यकता है।

जादू तारों की समस्या के लिए, बहुत सारे समाधान हैं। Constants, एक्सटेंशन विधियां, आदि

उन सभी के साथ, यदि आपके पास पृष्ठ पर संदर्भ पर निर्भर करता है जो पृष्ठ के संदर्भ पर निर्भर करता है, तो ViewModel आपका मित्र है।

एरिक

+0

मुझे पता है कि यह पुराना है, लेकिन क्या यह देखने के लिए नौकरी सूची और @ {Html.RenderAction ("SomeAction", "SomeController");} के आंशिक उपयोग का उपयोग करना बेहतर नहीं होगा? – wingyip

1

तो आप फिर से डिजाइन नहीं कर सकते मौजूदा ViewModel ViewBag का उपयोग करें।

0

2. क्या ऐसी स्थितियां हैं जहां एक व्यूबैग बिल्कुल जरूरी है?

कुछ मामलों में आपको लेआउट, विचार और आंशिक दृश्यों में नियंत्रक से अपना डेटा साझा करने की आवश्यकता होगी। इस मामले में, व्यूबैग बहुत उपयोगी है और मुझे संदेह है कि कोई बेहतर तरीका है।

0

यदि इसके लिए कोई उपयोग नहीं किया गया था, तो इसे पहले स्थान पर लागू नहीं किया जाएगा। हां आप ViewModels के साथ सब कुछ कर सकते हैं, लेकिन अगर आपको वास्तव में एक की आवश्यकता नहीं है तो क्या होगा? ऐसा एक परिदृश्य इकाइयों को संपादित कर रहा है। आप एक मॉडल के रूप में सीधे डीटीओ पास कर सकते हैं।

@model CategoryDto 
<div class="md-form form-sm"> 
    <input asp-for="Name" class="form-control"> 
    <label asp-for="Name">("Category Name")</label> 
</div> 

लेकिन यदि आप श्रेणी अभिभावक का चयन करना चाहते हैं तो क्या होगा? इकाई डीटीओ आदर्श केवल उसके अपने मूल्यों रखती है, तो चयन सूची को भरने के लिए आप ViewBag

<select asp-for="ParentId" asp-items="ViewBag.ParentList"> 
    <option value="">None</option> 
</select> 

क्यों ऐसा करने का उपयोग करें? खैर यदि आपके पास 50 प्रकार की इकाइयां हैं, जिनमें से प्रत्येक को अलग-अलग मूल्यों से चयन किया जाता है, तो आपने 50 अतिरिक्त व्यू मॉडेल बनाने से बचा है।

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