2012-06-23 23 views
10

मैं अपने फॉर्म तत्वों से डैश को एमवीसी 2, 3 में एएसपी.NET के नियंत्रकों के डिफ़ॉल्ट मॉडल बाध्यकारी व्यवहार में डालने के लिए एक रास्ता खोजने का प्रयास कर रहा हूं, या यहां तक ​​कि 4.फॉर्म एलीमेंट नामों में डैश के साथ एएसपी.नेट एमवीसी मॉडल बाध्यकारी

फ्रंट एंड डेवलपर के रूप में, मैं अपने सीएसएस में ऊंट के ऊपर या अंडरस्कोर पर डैश पसंद करता हूं।

<input type="text" name="first-name" class="required" /> 
<input type="text" name="last-name" class="required" /> 

नियंत्रक में, मैं एक सी # वस्तु में पारित किया जाएगा कि इस प्रकार दिखाई देगा:

public class Person 
{ 
     public string FirstName { get; set; } 
     public string LastName { get; set; } 
     //etc... 
} 

मेरी मार्कअप में, क्या मैं कुछ इस तरह है करने के लिए ऐसा करने में सक्षम होना चाहता हूँ क्या कुछ रेगेक्स या अन्य व्यवहार के माध्यम से इसे समायोजित करने के लिए Controller कक्षा का विस्तार करने का कोई तरीका है?

<input type="text" name="person.firstname" class="required" /> 

या यहाँ तक कि इस:

<input type="text" name="isPersonAttending" class="required" /> 

विचार मैं इस तथ्य मैं कुछ इस तरह करना है कि नहीं?

+1

मेरा उत्तर पर विचार मॉडल संपत्ति नामों को छोटा करने के बारे में अपने स्वयं के प्रश्न के लिए, जहां मैं उन्हें उपनाम कैसे दिखाता हूं http://stackoverflow.com/questions/4316301/asp-net-mvc-2-bind-a-models-property-to-a- अलग नामित-मूल्य # उत्तर -4316327 –

उत्तर

6

आप हमेशा अपना खुद का मॉडल बांधने की मशीन बना सकते हैं।

यहाँ एक उदाहरण है कि एक बांधने की मशीन का समर्थन करता है कि उपनाम जोड़ने गुण मॉडल करने के लिए लागू करता है:

[ModelBinder(typeof(AliasModelBinder))] 
public class Person 
{ 
     [BindAlias("first-name")] 
     public string FirstName { get; set; } 
     [BindAlias("last-name")] 
     public string LastName { get; set; } 
     //etc... 
} 

संपादित करें:

http://ole.michelsen.dk/blog/bind-a-model-property-to-a-different-named-query-string-field/

और साथ ऐसा कुछ करना यह कार्यान्वयन, जैसा कि ब्लॉगर कहते हैं, निम्नलिखित एसओ प्रश्न पर एंड्रस के उत्तर पर आधारित है: Asp.Net MVC 2 - Bind a model's property to a different named value

+1

कृपया ध्यान दें कि, जैसा कि ब्लॉग लेखक कहता है, और इसलिए यह, यहां मेरे अपने उत्तर की एक प्रति है: http://stackoverflow.com/questions/4316301/asp-net- mvc-2-bind-a-models-property-a-different-name-value # answer-4316327 –

+0

यह तार्किक है और यह बहुत समझ में आता है। धन्यवाद! –

+0

एंड्रेस, आप पूरी तरह से सही हैं, मैंने आपके उत्तर का संदर्भ नहीं देखा था। उसके लिए माफ़ करना। बीटीडब्ल्यू, महान कार्यान्वयन। –

3

कस्टम फॉर्म वैल्यू प्रदाता बनाकर आप आसानी से इस समस्या को हल कर सकते हैं। दूसरा फायदा यह है कि आप कस्टम विशेषताओं को सजाने के द्वारा सभी मॉडल गुणों को प्रदूषित करने से बच सकते हैं।

कस्टम प्रपत्र मूल्य प्रदाता

public class DashFormValueProvider : NameValueCollectionValueProvider 
{ 
    public DashFormValueProvider(ControllerContext controllerContext) 
    : base(controllerContext.HttpContext.Request.Form, 
    controllerContext.HttpContext.Request.Unvalidated().Form, 
    CultureInfo.CurrentCulture) 
    { 
    } 

    public override bool ContainsPrefix(string prefix) 
    { 
     return base.ContainsPrefix(GetModifiedPrefix(prefix)); 
    } 

    public override ValueProviderResult GetValue(string key) 
    { 
     return base.GetValue(GetModifiedPrefix(key)); 
    } 

    public override ValueProviderResult GetValue(string key, bool skipValidation) 
    { 
     return base.GetValue(GetModifiedPrefix(key), skipValidation); 
    } 

    // this will convert the key "FirstName" to "first-name". 
    private string GetModifiedPrefix(string prefix) 
    { 
     return Regex.Replace(prefix, "([a-z](?=[A-Z])|[A-Z](?=[A-Z][a-z]))", "$1-").ToLower(); 
    } 
} 

मूल्य प्रदाता फैक्टरी

public class DashFormValueProviderFactory : ValueProviderFactory 
{ 
    public override IValueProvider GetValueProvider(ControllerContext controllerContext) 
    { 
     if (controllerContext == null) 
     { 
      throw new ArgumentNullException("controllerContext"); 
     } 

     return new DashFormValueProvider(controllerContext); 
    } 
} 

Global.asax.cs

ValueProviderFactories.Factories.Add(new DashFormValueProviderFactory()); 
+0

अच्छा! मैं आपसे सहमत हूं - यदि आप अपने अधिकांश फॉर्म तत्व नामों के लिए डैश का उपयोग कर रहे थे, तो विशेषताओं का उपयोग करके थोड़ा अधिक होगा। शेयर के लिए धन्यवाद! –

+0

असाधारण रूप से काम किया। –