c# - MVC सार ViewModel, मान्यता गुण(गतिशील रूप से)



asp.net-mvc attributes abstract (1)

उम्मीद है कि मुझे कुछ स्पष्ट दिख रहा है, लेकिन मैंने कुछ लिखे गए कोड के साथ एक मुद्दा उठाया है, और ऐसा महसूस नहीं है कि मैंने अपना कोड सही तरीके से लिखा है

तो, मान लें कि मेरे पास निम्न मॉडल है:

public class SampleViewModel {
    [Required]
    public string Property1 { get; set; }
    [Required]
    [EmailAddress]
    public string Property2 { get; set; }
    public IList<AbstractModel> Items { get; set; }
}

और फिर मेरे पास यह सार दृश्य मॉडल है:

public abstract AbstractModel {
    [Required(ErrorMessage = "This field is required")]
    public virtual string Value { get; set; }
}

और इन ठोस दृश्य मॉडल:

public ConcreteModel1 : AbstractModel { }
public ConcreteModel2 : AbstractModel { }

मेरे नियंत्रक के भीतर, मेरे पास निम्न कोड है (यह वास्तव में कहीं और किया जा रहा है, लेकिन इस नमूना के लिए, यह ठीक है):

var model = new SampleViewModel();
var fields = new List<AbstractModel>() {
    new ConcreteModel1() { Value = model.Property1 },
    new ConcreteModel2() { Value = model.Property2 },
};
model.Fields = fields;
return View(model);

SampleViewModel आंशिक दृश्य (जैसा कि मेरे पास प्रत्येक दृश्य मॉडल प्रकार के लिए है) के भीतर, मेरे पास निम्न है:

@model SampleViewModel
@for(var i = 0; i < Model.Items; i++) {
    @Html.EditorFor(m => Model.Items[i])
}

चलो कहना है कि मेरे पास प्रत्येक एब्स्ट्रक मोडेल के अनुसार एक अलग आंशिक दृश्य (बहुत अलग लेआउट आवश्यकताओं के साथ) है।

कंक्रीटमोडेल 1 के लिए उदाहरण:

@model ConcreteModel1
@Html.TextboxFor(m => m.Value)

और कंक्रीटमॉडेल 2 के लिए:

@model ConcreteModel2
@Html.DisplayFor(m => m.Value)

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

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

उम्मीद

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

तो महत्वपूर्ण बात यह है कि मेरे खेतों की निम्नलिखित रचना पर विचार करना:

var fields = new List<AbstractModel>() {
    new ConcreteModel1() { Value = model.Property1 },
    new ConcreteModel2() { Value = model.Property2 },
};

एब्जेक्ट मोडल्स को यह कैसे पता है कि उनके मूल्यों की अपेक्षा की जाती है: आवश्यक, और आवश्यक और एक ईमेल पता, उन गुणों के आधार पर जो उन्हें बनाने के लिए उपयोग किए जाते हैं?

आपके इनपुट के लिए धन्यवाद।


Answers

अगर यह कैच ब्लॉक के अंदर का स्टेटमेंट नहीं है, तो क्या यह समान नहीं है?

नहीं। यह अपवाद-फेंक प्रणाली के लाभ के लिए "भेदभाव करनेवाला" के रूप में अधिक कार्य करता है।

याद रखें कि अपवाद दो बार कैसे फेंके जाते हैं?

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

दूसरा "थ्रो" कॉल स्टैक को अनइंस्टॉल करता है, जो बारी-बारी से उन "ब्लॉक" में से प्रत्येक को निष्पादित करता है और फिर निष्पादन इंजन को स्थित एक्सेप्शन हैंडलिंग कोड के एंट्री पॉइंट पर डिलीवर करता है।

पहले, हम केवल विभिन्न प्रकार के अपवादों के बीच भेदभाव कर सकते थे। यह डेकोरेटर हमें महीन-दाना नियंत्रण देता है, केवल एक विशेष प्रकार के अपवाद को पकड़ता है जो एक ऐसी स्थिति में होता है जिसके बारे में हम कुछ कर सकते हैं
उदाहरण के लिए (पतली हवा से) आप एक "डेटाबेस अपवाद" को संभालना चाह सकते हैं जो टूटे हुए कनेक्शन को इंगित करता है और जब ऐसा होता है, तो स्वचालित रूप से पुन: कनेक्ट करने का प्रयास करें।
डेटाबेस संचालन के बहुत सारे "डेटाबेस अपवाद" को फेंक देते हैं, लेकिन आप केवल उनमें से एक विशेष "उप-प्रकार" में रुचि रखते हैं, अपवाद वस्तु के गुणों के आधार पर, जो सभी अपवाद-फेंकने वाली प्रणाली के लिए उपलब्ध हैं।

कैच ब्लॉक के अंदर एक "यदि" स्टेटमेंट समान अंतिम परिणाम प्राप्त करेगा , लेकिन यह रन-टाइम पर "अधिक" खर्च होगा। क्योंकि यह ब्लॉक किसी भी और सभी "डेटाबेस अपवाद" को पकड़ लेगा, यह उन सभी के लिए लागू किया जाएगा, भले ही यह केवल उनमें से एक [बहुत] छोटे अंश के लिए कुछ उपयोगी कर सकता है। इसका मतलब यह भी है कि आपको फिर से [सभी] अपवादों को फिर से फेंकना होगा, जिसके साथ आप कुछ भी उपयोगी नहीं कर सकते हैं , जो कि केवल पूरे, दो-पास, हैंडलर-फाइंडिंग, अंत में कटाई, अपवाद-फेंकने वाले फ़ार्गो को दोहरा रहा है एक बार फिर।

सादृश्य: एक [बहुत अजीब] टोल ब्रिज।

डिफ़ॉल्ट रूप से, आपको टोल का भुगतान करने के लिए प्रत्येक कार को "पकड़ना" पड़ता है। यदि कहें, शहर के कर्मचारियों द्वारा संचालित कारों को टोल से छूट दी गई है (मैंने कहा था कि यह अजीब था), तो आपको केवल किसी और द्वारा संचालित कारों को रोकने की आवश्यकता है।

आप हर कार को रोक सकते हैं और पूछ सकते हैं:

catch( Car car ) 
{ 
   if ( car.needsToPayToll() ) 
      takePayment( car ); 
} 

या, यदि आपके पास कार से "पूछताछ" करने का कोई तरीका है, तो आप शहर के कर्मचारियों द्वारा संचालित उन लोगों को अनदेखा कर सकते हैं, जैसे:

catch( Car car ) when car.needsToPayToll() 
{ 
   takePayment( car ); 
} 




c# asp.net-mvc model attributes abstract