रनटाइम पर संपादक टेम्पलेट्स

यह समस्या समझाने में थोड़ा मुश्किल है इसलिए मैं एक उदाहरण देने की कोशिश करूंगा। मान लें कि मेरे पास निम्न प्रकार है:

public class FieldResult {
    public Field Field { get; set; }
    public T Answer { get; set; }

    public FieldResult(Field field) {
        Field = field;
    }
}

अब कहें कि मेरे पास निम्नलिखित दृश्य मॉडल है:

public class Form {
    public IList> Results { get; set; }

    public Form(IList fields) {
        Results = fields.Select(f => new FieldResult(f)).ToList();
    }
}

यदि मैं निम्नलिखित में निम्नलिखित कहता हूं:

@foreach (var result in Model.Results) {
    @Html.EditorFor(m => result, "CheckBoxField")
}

अब कहें कि मेरे पास निम्न चेकबॉक्स फ़ील्ड संपादक टेम्पलेट है:

@model FieldResult
@Html.CheckBoxFor(m => m.Answer)

यह सब ठीक संकलित करता है लेकिन मुझे रनटाइम पर निम्न त्रुटि मिलती है:

शब्दकोश में गुजरने वाला मॉडल आइटम प्रकार का है   'FieldResult 1 [System.Object]', लेकिन इस शब्दकोश को एक मॉडल की आवश्यकता है   'फील्ड रीसेट </कोड> 1 [सिस्टम.बोलियन]' प्रकार का आइटम।

अगर कोई यह कह सकता है कि यह संभव है और संभवतः इसके बारे में जाने का एक तरीका सुझाता है तो मैं इसकी सराहना करता हूं। धन्यवाद

0
जोड़ा संपादित
विचारों: 1

1 उत्तर

You try to pass a FieldResult value in a template whose model is of type FieldResult, they're different types so you get that error. You can either change your Results property and make it an IList>, or cast your collection items in your view.

यदि आपको विभिन्न प्रकार के परिणाम बनाने की आवश्यकता है, तो आप वर्ग विरासत का उपयोग करने पर भी विचार कर सकते हैं:

public abstract class FieldResult {
    public Field Field { get; set; }

    public FieldResult(Field field) {
        Field = field;
    }
}

public class BooleanFieldResult : FieldResult {
    public bool Answer { get; set; }

    public FieldResult(Field field) : base(field) {
    }
}

आपका <�कोड> फ़ॉर्म वर्ग इस तरह दिखेगा:

public class Form {
    public IList Results { get; set; }

    public Form(IList fields) {
        Results =//... you choose which child class inherited from FieldResult you want to use
    }
}

आपका विचार यह जांच करेगा कि यह किस प्रकार है:

@foreach (var result in Model.Results) {
    if(result is BooleanFieldResult) {
        var booleanResult = (BooleanFieldResult)result;
        @Html.EditorFor(m => booleanResult , "CheckBoxField")
    }
}

फिर आपका चेकबॉक्स फ़ील्ड टेम्पलेट इस तरह दिखेगा:

@model BooleanFieldResult
@Html.CheckBoxFor(m => m.Answer)
0
जोड़ा
धन्यवाद इसने त्रुटि दी "टेम्पलेट का उपयोग केवल फ़ील्ड एक्सेस, प्रॉपर्टी एक्सेस, सिंगल-आयाम सरणी इंडेक्स, या सिंगल-पैरामीटर कस्टम इंडेक्स एक्सप्रेशन के साथ किया जा सकता है।" तो मैंने संपादक के बाहर कास्ट लिया और इसे एक चर में संग्रहीत किया और यह सही ढंग से प्रदर्शित हुआ। मैं इसे अभी खोल दूंगा क्योंकि मुझे अधिक काम करने की ज़रूरत है लेकिन मुझे सही दिशा में रखने के लिए धन्यवाद।
जोड़ा लेखक nfplee, स्रोत
मैंने अभी अपना परीक्षण पूरा कर लिया है और यह अच्छी तरह से काम कर रहा है। मैं अपने पास बहुत सारे बकवास कोड से छुटकारा पाने में सक्षम था और यह दृष्टिकोण मुझे प्रत्येक फ़ील्ड प्रकारों के लिए कस्टम सत्यापन करने की अनुमति देता है। एक बार फिर धन्यवाद।
जोड़ा लेखक nfplee, स्रोत
तुम सही हो, मैंने अपना जवाब संपादित किया
जोड़ा लेखक Réda Mattar, स्रोत