2012-04-27 11 views
5

क्या सी से पहले ए और बी गुणों को बाध्य करने का कोई तरीका है?एएसपी.नेट एमवीसी (4) - एक निश्चित क्रम में बाध्य गुण

सिस्टम में ऑर्डर प्रॉपर्टी है। कॉम्पोनेंट मॉडेल.डाटाएनोटेशन। डिस्प्ले एट्रिब्यूट क्लास, लेकिन क्या यह बाध्यकारी ऑर्डर को प्रभावित करता है?

मैं क्या हासिल करने की कोशिश कर रहा हूँ

page.Path = page.Parent.Path + "/" + page.Slug 
एक कस्टम में

है ModelBinder

+0

क्या मैं यह कहने में सही होगा कि 'पेज.पेंट.पैथ' और 'पेज। स्लग' फॉर्म से बंधे जा रहे हैं और आप बाध्यकारी होने के बाद ही 'पेज' पाथ को अपनी सामग्री के समापन पर सेट करना चाहते हैं? यानी 'पेज। पथ' मान फॉर्म पर मौजूद नहीं है? – Dangerous

+0

@ खतरनाक सही, 'पृष्ठ। पाथ' फॉर्म पर नहीं है। मुझे फॉर्म से 'पेज। अभिभावक। आईडी' और 'पृष्ठ.Slug' मिलता है। –

+0

और मैं 'पृष्ठ' के बाद 'पेज' पाथ बनाना चाहता हूं। माता-पिता और 'पृष्ठ। लग' बाध्य हैं। –

उत्तर

0

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

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

@using (Html.BeginForm()) 
{ 
    <p>Parent Path: @Html.EditorFor(m => m.ParentPath)</p> 
    <p>Slug: @Html.EditorFor(m => m.Slug)</p> 
    <input type="submit" value="submit" /> 
} 

और निम्न दृश्य मॉडल (या डोमेन मॉडल जैसा भी मामला हो):

सार्वजनिक वर्ग IndexViewModel { सार्वजनिक स्ट्रिंग ParentPath {

तो मान आप निम्नलिखित दृश्य है की सुविधा देता है प्राप्त; सेट; } सार्वजनिक स्ट्रिंग स्लग {प्राप्त करें; सेट; } सार्वजनिक स्ट्रिंग पथ {प्राप्त करें; सेट; } }

फिर आप निम्नलिखित मॉडल बांधने की मशीन निर्दिष्ट कर सकते हैं:

public class IndexViewModelBinder : DefaultModelBinder 
    { 
     protected override void OnModelUpdated(ControllerContext controllerContext, ModelBindingContext bindingContext) 
     { 
      //Note: Model binding of the other values will have already occurred when this method is called. 

      string parentPath = bindingContext.ValueProvider.GetValue("ParentPath").AttemptedValue; 
      string slug = bindingContext.ValueProvider.GetValue("Slug").AttemptedValue; 

      if (!string.IsNullOrEmpty(parentPath) && !string.IsNullOrEmpty(slug)) 
      { 
       IndexViewModel model = (IndexViewModel)bindingContext.Model; 
       model.Path = bindingContext.ValueProvider.GetValue("ParentPath").AttemptedValue + "/" + bindingContext.ValueProvider.GetValue("Slug").AttemptedValue; 
      } 
     } 
    } 

और अंत में है कि यह मॉडल बांधने की मशीन दृश्य मॉडल पर निम्न विशेषता का उपयोग करके उपयोग किया जाता है निर्दिष्ट करें:

[ModelBinder(typeof(IndexViewModelBinder))] 
1

क्यों के रूप में पृष्ठ संपत्ति को लागू नहीं:

public string Path{ 
    get { return string.Format("{0}/{1}", Parent.Path, Slug); } 
} 

?

+0

इससे सभी पृष्ठ के पूर्वजों की आलसी लोडिंग एक-एक हो जाएगी। उदाहरण के लिए। यदि आप 10 पेज प्रदर्शित करते हैं (प्रत्येक पदानुक्रम में स्तर 3 पर) जो डेटाबेस को अतिरिक्त 20 प्रश्नों का कारण बन सकता है। –

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