2013-08-10 10 views
14

साथ काम करता है के लिए अपने खुद के HtmlHelper विस्तार बनाना मैं वर्तमान DropDownList कार्यान्वयन से नाखुश हूँ, क्योंकि मैं वास्तव में विकल्प टैग के साथ ज्यादा कुछ नहीं कर सकते हैं (केवल चयनित, पाठ और मूल्य समर्थित है)। मैं अपना खुद का बनाना चाहता हूं जहां मैं अलग-अलग विकल्पों पर अक्षम और अन्य सामान सेट कर सकता हूं।इनपुट है कि मॉडल बंधन

वर्तमान में मैं जावास्क्रिप्ट द्वारा विकल्पों को बदल रहा हूं, लेकिन मुझे लगता है कि यह करने के लिए यह एक हैकी तरीका है, और मैं बस शुरू करने के लिए सही एचटीएमएल प्रस्तुत करना पसंद करूंगा।

मुझे पता है कि मैं सिर्फ एक टेम्पलेट बना सकता हूं जो चुनिंदा और विकल्प टैग का उपयोग करता है और विकल्पों को वैसे ही बनाता है जैसा मैं चाहता हूं - लेकिन सामान्य ड्रॉपडाउनलिस्ट एक्सटेंशन सामान वैल सामान और एक विशिष्ट नाम और आईडी जोड़ता है जो मुझे लगता है कि उचित डेटाबेसिंग के लिए है

<select data-val="true" data-val-number="The field SelectedValue must be a number." id="ParentDropDown_SelectedValue" name="ParentDropDown.SelectedValue"> 

मैं अपने खुद के टेम्पलेट्स के लिए इन विशेषताओं को जोड़ने के बारे में कैसे जाना है: पर्चे को जमा?

+0

इसका संभावित डुप्लिकेट: http://stackoverflow.com/questions/2655035/creating-a-selectlistitem-with-the-disabled-disabled-attribute – ataravati

+0

आप सही हैं, वह वही अंतिम परिणाम चाहते हैं। मुझे वह नहीं मिला था। लेकिन मुझे वहां जवाब पसंद नहीं है क्योंकि यह थोड़ी हैकी भी लगता है। मैं डैनियल जे जी के जवाब देने की कोशिश कर रहा हूं क्योंकि ऐसा लगता है कि मैं जिस तरह से जाना चाहता था। – Inrego

उत्तर

27

आप ठीक कह रहे हैं, उन विशेषताओं (और विशेष रूप से नाम विशेषता) मॉडल बंधन के लिए महत्वपूर्ण हैं।

क्या आप var fieldName = ExpressionHelper.GetExpressionText(expression); उपयोग कर सकते हैं फ़ील्ड नाम पाने के लिए की तरह

public static MvcHtmlString CustomHelperFor<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression) 

पहले एक कस्टम सहायक बनाने के लिए चाहते हैं।

फिर क्रम पूरा नाम पाने के लिए, नेस्ट विचारों की देखभाल करने में var fullBindingName = html.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(fieldName); का उपयोग करें।

अंत में आप var fieldId = TagBuilder.CreateSanitizedId(fullBindingName); का उपयोग कर एक आईडी गुण में इस बदल सकता है।

public static MvcHtmlString CustomHelperFor<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression) 
{    
    var fieldName = ExpressionHelper.GetExpressionText(expression); 
    var fullBindingName = html.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(fieldName); 
    var fieldId = TagBuilder.CreateSanitizedId(fullBindingName); 

    var metadata = ModelMetadata.FromLambdaExpression(expression, html.ViewData); 
    var value = metadata.Model; 

    TagBuilder tag = new TagBuilder("input"); 
    tag.Attributes.Add("name", fullBindingName); 
    tag.Attributes.Add("id", fieldId); 
    tag.Attributes.Add("type", "text"); 
    tag.Attributes.Add("value", value == null ? "" : value.ToString()); 

    var validationAttributes = html.GetUnobtrusiveValidationAttributes(fullBindingName, metadata); 
    foreach (var key in validationAttributes.Keys) 
    { 
     tag.Attributes.Add(key, validationAttributes[key].ToString()); 
    } 

    return new MvcHtmlString(tag.ToString(TagRenderMode.SelfClosing)); 
} 

आपको इस तरह के एक दृश्य में उपयोग कर सकते हैं:

@Html.CustomHelperFor(model => model.ParentDropDown.SelectedValue) 

और यह निम्नलिखित एचटीएमएल का उत्पादन करेगा:

तो है कि एक पाठ बॉक्स बनाता है एक सरल कस्टम सहायक के रूप में लिखा जा सकता है

<input id="ParentDropDown_SelectedValue" name="ParentDropDown.SelectedValue" type="text" value="4"> 

आशा है कि यह मदद करता है!

+0

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

+0

इसे समझ लिया! धन्यवाद एक गुच्छा आदमी! – Inrego

+0

@Inrego, सुनने के लिए कि :) –

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