2015-04-09 11 views
5

मुझे अपने एमवीसी अनुप्रयोग में व्यूमोडल्स के पॉलीमोर्फिक संग्रह के साथ समस्या हो रही है। मुझे यह एक वेब सेवा कॉल के माध्यम से प्राप्त हुआ और मुझे ऑब्जेक्ट प्रकार के आधार पर उन्हें फिर से शुरू करने और उन्हें अपना आंशिक दृश्य देने की आवश्यकता है।एमआईवी आंशिक दृश्यों में पॉलीमोर्फिक व्यू मॉडेल संग्रह और प्रतिपादन

public abstract class ProvinceViewModel 
{ 
    public string Code { get; set; } 
} 

public sealed class OntarioViewModel : ProvinceViewModel { } 

public sealed class QuebecViewModel : ProvinceViewModel {} 

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

ICollection<ProvinceViewModel> ProvinceList; // collection receive via service 

@for (int i = 0, c = ProvinceList.Count; i < c; i++) 
{ 
    var currentProvince = this.Model.ElementAt(i); 
    @switch (additionalRegistry.Code) 
    { 
     case "QC": 
      @Html.Partial("AlbertaDetail", (QuebecViewModel)currentProvince) 
      break;        
     case "ON": 
      @Html.Partial("OntarioDetail", (OntarioViewModel)currentProvince) 
      break; 
     default: 
      @Html.Partial("ProvinceDetail", ProvinceViewModel) 
      break; 
    } 
} 

मेरे पास दृढ़ता से टाइप प्रकार है, ताकि मैं विभिन्न गुणों तक पहुंच सकूं।

मैं इसे और अधिक सुरुचिपूर्ण तरीके से हल करने के बारे में कैसे जाउंगा? क्या मुझे अमूर्त वर्ग के लिए एक नया सरोगेट बेस क्लास बनाने की आवश्यकता होगी ताकि इसका उदाहरण आसान हो सके?

+0

आप 'ProvinceDetail' पेज कर हो सकता था अपने नियंत्रक दृश्य निर्देशिका के भीतर DisplayTemplates फ़ोल्डर में प्रत्येक प्रकार के लिए एक प्रदर्शन टेम्पलेट बनाएँ बदले में अलग-अलग प्रांतों का इलाज करने के बजाय स्विचिंग?यदि आप इन अन्यत्र – DLeh

+1

का उपयोग करते हैं, तो इसे दोहराने के बजाए उस पृष्ठ पर तर्क को रखने की अनुमति होगी यह स्पष्ट नहीं है: क्या आपको प्रांत के प्रत्येक * ठोस प्रकार * के लिए आंशिक दृश्य को तुरंत चालू करने की आवश्यकता है, या प्रत्येक * तत्काल * ? यह अजीब लगता है कि उदाहरण के लिए, आपके पास कई आंशिक QuebecDetail विचार होंगे। – Kjata30

+0

क्षमा करें, मैंने उदाहरण को सरल बनाने की कोशिश की। मुझे प्रत्येक प्रांत के लिए आंशिक दृश्य को तुरंत चालू करने की आवश्यकता है जिसमें कुछ अलग-अलग गुण हैं। उदाहरण के लिए ओन्टारियो, क्यूबेक, मनीतोबा, बीसी के सभी में एक विशिष्ट और अलग आंशिक दृश्य है, बाकी सब कुछ मानक डिफ़ॉल्ट जेनेरिक व्यू यानी मिलता है। ProvinceDetail। परिणाम मुख्य पृष्ठ पर प्रांतों और उनके विवरण की एक सूची होगी। – mflair2000

उत्तर

0

मुझे एक समान आवश्यकता थी और इस तरह मैंने इस मुद्दे को हल करने में कामयाब रहे। मेरा व्यूमोडेल (BusinessEventEmailViewModel) में एकता के साथ रनटाइम पर हल इंटरफेस (IBusinessEventEmail) की एक सूची है। एक IBusinessEventEmail में इवेंटकोड संपत्ति है। तब

Html.RenderPartial("~/Views/Shared/Email/_" + businessEvent.EventCode + ".cshtml", businessEvent); 

, मैं एक XXXEventEmail EventCode XXX और एक आंशिक दृश्य _XXX.cshtml

1
साथ IBusinessEventEmail को लागू करने के लिए है:

public class BusinessEventEmailViewModel : MailHeaderViewModel 
{ 
    #region members 
    public List<IBusinessEventEmail> Events { get; set; } 

मेरे विचार में, मैं एक नामकरण परंपरा का उपयोग कर आंशिक दृश्य प्रस्तुत करना

अतीत में एक ही समस्या का सामना करने पर, मैंने निम्नलिखित समाधान बनाया है:

सबसे पहले,के साथ अपने (ठोस) दृश्य-मॉडल को सजाने के लिएविशेषता जो उपयोग नाम का उपयोग करने के लिए दर्शाती है। उदाहरण के लिए:

[ExportMetadata("View", "Ontario")] 
public sealed class OntarioViewModel : ProvinceViewModel { } 

[ExportMetadata("View", "Quebec")] 
public sealed class QuebecViewModel : ProvinceViewModel {} 

तो निम्नलिखित Partial विधि के साथ अपने HtmlHelper का विस्तार:

public static MvcHtmlString Partial<T>(this HtmlHelper htmlHelper, T model, string prefix = null) 
{ 
    var modelType = typeof (T); 
    var partialAttr = modelType.GetCustomAttributes<ExportMetadataAttribute>().SingleOrDefault(x => x.Name == "View"); 

    if (partialAttr == null) 
     throw new Exception(modelType.Name + " doesn't define any view to be used"); 

    var partialName = (prefix ?? String.Empty) + partialAttr.Value; 

    return htmlHelper.Partial(partialName, model, htmlHelper.ViewData); 
} 

फिर इसका इस्तेमाल:

@Html.Partial(currentProvince); 

और मामले में अपने partials कुछ उप-निर्देशिका में रहते हैं:

@Html.Partial(currentProvince, "Partials/") 

(यदि आपको कस्टम एचटीएमएल हेल्पर को पंजीकृत करने में मदद की ज़रूरत है तो https://stackoverflow.com/a/5052790 देखें)

0

आप इसे प्रदर्शन टेम्पलेट्स के साथ प्राप्त कर सकते हैं।

+-- Views 
    +-- Provinces 
     +-- DisplayTemplates 
      +-- OntarioViewModel.cshtml 
      +-- QuebecViewModel.cshtml 

प्रदर्शन एक मॉडल के अपने ध्यान में रखते हुए DisplayFor सहायक का उपयोग कर:

@model ICollection<ProvinceViewModel> 

@foreach (var province in Model) 
{ 
    @Html.DisplayFor(_ => province) 
} 
संबंधित मुद्दे