2010-09-09 11 views
6

साल मैं ASP.NET वेब प्रपत्रों विकास मैं एक मालिकाना पुस्तकालय द्वारा खराब था, जो मेरे जैसे काम करने की अनुमति दी किया की संख्या के लिए:मॉडल बाइंडर वेबफ़ॉर्म

UpdateToObject(ControlsCollection, obj) 
    UpdateFromObject(ControlsCollection, obj) 

वैचारिक कोड बहुत कुछ किया एमवीसी मॉडल बाइंडर क्या करता है, यानी फॉर्म के पोस्ट किए गए मानों को इनपुट के रूप में दिया जाता है, यह कस्टम ऑब्जेक्ट को पॉप्युलेट करेगा। मूल रूप से यह बंदर कोड जैसे

employee.Name = txtName.Text; 
employee.DOB = DateTime.Parse(txtDOB.Text); 

और इतने पर ..

अब, यह मालिकाना पुस्तकालय नहीं नई परियोजना के साथ मैं सम्मिलित हूं पर उपलब्ध है ऐसा करने से डेवलपर मुक्त कर दिया, और यह एक वेब प्रपत्रों परियोजना है । इसलिए मैं सोच रहा हूं कि वेब फॉर्म के संदर्भ में System.Web.Mvc.DefaultModelBinder का उपयोग करने का कोई तरीका है या नहीं। लक्ष्य डोमेन ऑब्जेक्ट्स और बैक से नियंत्रण की सरल और आसान आबादी हासिल करना है, आदर्श रूप से विचाराधीन सत्यापन एनोटेशन के साथ। यदि ऐसा संभव नहीं है तो कोई मुझे इस आवश्यकता को हल करने के लिए ओपन सोर्स समाधान पर इंगित कर सकता है। मैं वास्तव में ऐसे कोड को फिर से लिखना पसंद नहीं करता हूं।

अग्रिम धन्यवाद।

उत्तर

1

शेरलॉक, आप एमवीसी से मॉडलबिंडर का उपयोग करने की कोशिश कर रहे कुछ मुद्दों में भाग लेंगे क्योंकि वे कंट्रोलर कॉन्टेक्स्ट पर भरोसा करते हैं।

मैंने पहले इसी तरह के प्रश्न का उत्तर दिया ChangeType, Convert - Converting from one type to another लेकिन यह वास्तव में आप जो खोज रहे हैं वह वास्तव में है। अपने ब्लॉग पर इस ब्लॉग पोस्ट ChangeType – Changing the type of a variable in C#

मूलतः

चेक बाहर, आप एक ही विधि ChangeType<T> कहा जाता है कि पैरामीटर आप एक जोरदार टाइप किया फैशन में ढूंढ रहे हैं या कोई डिफ़ॉल्ट मान यदि का मान देता है मिल पैरामीटर मौजूद नहीं है।

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

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

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

संपादित -

नीचे है कि मैं पहले उपयोग किए गए वास्तव में आप क्या जरूरत है ऐसा करने के लिए कक्षाओं के एक समूह के साथ एक .cs फ़ाइल है। पहला एक MsPropertyAssignerProvider वह है जिसे आप अपने पृष्ठ के भीतर से काम करेंगे।

आप अपने नियंत्रणों पर फिर से प्रयास करेंगे और GetPropertyAssigner विधि को नियंत्रण के प्रकार के नाम से गुजरने के लिए कॉल करेंगे। यह विधि ऑब्जेक्टप्रॉपर्टीएस्सिनेर का एक उदाहरण देता है जिसमें SetPropertyValue नामक एक विधि है जिसे आप अपने ऑब्जेक्ट इंस्टेंस और नियंत्रण उदाहरण को पास कर सकते हैं।

internal class MsPropertyAssignerProvider 
    { 
    private Hashtable propertyAssigners; 

    internal MsPropertyAssignerProvider() 
    { 
     propertyAssigners = new Hashtable(); 
     RegisterPropertyAssigner(typeof(TextBox).ToString(), new TextBoxValueExtractor()); 
     RegisterPropertyAssigner(typeof(DropDownList).ToString(), new DropDownListValueExtractor()); 
     RegisterPropertyAssigner(typeof(Label).ToString(), new LabelValueExtractor()); 
     RegisterPropertyAssigner(typeof(CheckBox).ToString(), new CheckBoxValueExtractor()); 
    } 

    internal void RegisterPropertyAssigner(string identifier, IMsObjectPropertyAssigner assigner) 
    { 
     if (propertyAssigners.ContainsKey(identifier)) 
     throw new DuplicatePropertyAssignerRegistrationException(identifier); 
     propertyAssigners.Add(identifier, assigner); 
    } 

    internal IMsObjectPropertyAssigner GetPropertyAssigner(string identifier) 
    { 
     return (propertyAssigners.ContainsKey(identifier)) ? (IMsObjectPropertyAssigner)propertyAssigners[identifier] : null; 
    } 
    } 

साथ वर्ग कोई बात नहीं मैं संपादक पूरी तरह से कोड सूची को खराब करता क्या कर नीचे

public interface IMsObjectPropertyAssigner 
    { 
    void SetPropertyValue(object obj, System.Web.UI.Control control); 
    } 

    internal abstract class BaseValueExtractor : IMsObjectPropertyAssigner 
    { 
    protected MsReflectionHelper reflectionHelper = new MsReflectionHelper(); 
    protected string FixStringForNumber(string stringValue) 
    { 
     if (stringValue.Length == 0) 
     return "0"; 
     else 
     return stringValue; 
    } 
    public abstract void SetPropertyValue(object obj, System.Web.UI.Control control); 
    } 

    internal class TextBoxValueExtractor : BaseValueExtractor 
    { 
    public override void SetPropertyValue(object obj, System.Web.UI.Control control) 
    { 
     TextBox textBox = (TextBox)control; 
     PropertyInfo propInfo = reflectionHelper.GetPropertyInfo(obj, control.ID); 
     Type propType = propInfo.PropertyType; 
     if (propType == typeof(System.String)) 
     reflectionHelper.SetPropertyValue(obj, control.ID, textBox.Text); 
     else if (propType == typeof(System.Int16)) 
     reflectionHelper.SetPropertyValue(obj, control.ID, Int16.Parse(FixStringForNumber(textBox.Text), System.Globalization.NumberStyles.Currency)); 
     else if (propType == typeof(System.Int32)) 
     reflectionHelper.SetPropertyValue(obj, control.ID, Int32.Parse(FixStringForNumber(textBox.Text), System.Globalization.NumberStyles.Currency)); 
     else if (propType == typeof(System.Int64)) 
     reflectionHelper.SetPropertyValue(obj, control.ID, Int64.Parse(FixStringForNumber(textBox.Text), System.Globalization.NumberStyles.Currency)); 
     else if (propType == typeof(System.Double)) 
     reflectionHelper.SetPropertyValue(obj, control.ID, Double.Parse(FixStringForNumber(textBox.Text), System.Globalization.NumberStyles.Currency)); 
     else if (propType == typeof(System.Single)) 
     reflectionHelper.SetPropertyValue(obj, control.ID, Single.Parse(FixStringForNumber(textBox.Text), System.Globalization.NumberStyles.Currency)); 
     else 
     reflectionHelper.SetPropertyValue(obj, control.ID, textBox.Text); 
    } 
    } 

    internal class DropDownListValueExtractor : BaseValueExtractor 
    { 
    public override void SetPropertyValue(object obj, System.Web.UI.Control control) 
    { 
     DropDownList dropDownList = (DropDownList)control; 
     reflectionHelper.SetPropertyValue(obj, control.ID, dropDownList.SelectedValue); 
    } 
    } 

    internal class LabelValueExtractor : BaseValueExtractor 
    { 
    public override void SetPropertyValue(object obj, Control control) 
    { 
     Label label = (Label)control; 
     reflectionHelper.SetPropertyValue(obj, control.ID, label.Text); 
    } 
    } 

    internal class CheckBoxValueExtractor : BaseValueExtractor 
    { 
    public override void SetPropertyValue(object obj, Control control) 
    { 
     CheckBox checkbox = (CheckBox)control; 
     reflectionHelper.SetPropertyValue(obj, control.ID, checkbox.Checked); 
    } 
    } 

क्षमा सूचीबद्ध हैं। लेकिन मुझे उम्मीद है कि यह मदद करता है।

+0

केवल 1 और अंतिम पैराग्राफ उठाए गए प्रश्न के लिए कुछ हद तक प्रासंगिक हैं। मुझे प्रतिबिंब का उपयोग करने में कोई फर्क नहीं पड़ता। इस तरह मालिकाना पुस्तकालय काम करता है। – Sherlock

+0

मुझे आपके मामले में लगता है क्योंकि आप नियंत्रण के साथ काम कर रहे हैं समाधान थोड़ा और अधिक शामिल है। DtoBinder क्लास आपके डीटीओ ऑब्जेक्ट का एक उदाहरण बना सकता है और NameValues ​​के संग्रह के बाद सभी संपत्ति मानों को असाइन कर सकता है। तो आपको यह करने की ज़रूरत है कि इस संग्रह को नियंत्रण के नामों और मूल्यों से इकट्ठा करें और इसे डीटोबिंडर को सौंप दें। –

+0

मैंने अपने मूल उत्तर को कुछ अतिरिक्त वर्गों के साथ संपादित किया है जिन्हें मैंने पहले उपयोग किया था। –

1

क्या आप इस तरह के कुछ के लिए ऑटोमैपर का उपयोग नहीं कर पाएंगे? बस अपने नक्शे सेट करें और यह नई ऑब्जेक्ट्स बनाएगा और मूल्यों को कॉपी करेगा।

0

यह एक पुराना सवाल है, लेकिन यह पता लगाने की कोशिश करते हुए कि डिफ़ॉल्ट मॉडल बाइंडर वास्तव में कैसे काम करता है, मैं इसमें घुस गया।

मेरे पास कोडप्रोजेक्ट पर एक प्रोजेक्ट है जो वास्तव में आप जो चाहते हैं (ed), have a look

चीयर्स!