2010-08-18 11 views
5

उत्पन्न नहीं करते हैं, निम्न कोड का उपयोग करते समय, लेबल की आईडी और लेबल के गुण में आईडी समान नहीं है।लेबलफ़ोर और टेक्स्टबॉक्स के लिए एक ही आईडी का

<%: Html.LabelFor(x => x.Localizations["en"]) %> => Localizations[en] 
<%: Html.TextBoxFor(x=> x.Localizations["en"]) %> => Localizations_en_ 

<%: Html.LabelFor(x => x.Localizations["en"].Property) %> 
     => Localizations[en]_Property 
<%: Html.TextBoxFor(x=> x.Localizations["en"].Property) %> 
     => Localizations_en__Property 

मैं परावर्तक में कोड का पता लगाया और देखा कि जिस तरह से मान उत्पन्न कर रहे हैं अलग हैं। एक ही सहायक विधि का उपयोग नहीं कर रहा है।

लेबलफ़ोर HtmlHelper.GenerateIdFromName का उपयोग करता है और टेक्स्टबॉक्स फोर TagBuilder#GenerateId का उपयोग करता है।

क्या किसी को इसका कारण पता है, या एक कामकाज (इनपुट/टेक्स्टरेरा/चयन सहायक के अपने पूरे सेट को छोड़कर)? या यह एक बग है?

अद्यतन:

जब से मैं वैसे भी लेबल पाठ के लिए एक दूसरे पैरामीटर के साथ लेबल के लिए एक एचटीएमएल सहायक का उपयोग करें, मैं फॉर्म फील्ड सहायकों के रूप में एक ही आईडी पीढ़ी कोड का उपयोग करने के लिए इसे संशोधित किया था।

public static MvcHtmlString LabelFor<TModel, TValue>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TValue>> expression, string labelText) 
{ 
    // The main part of this code is taken from the internal code for Html.LabelFor<TModel, TValue>(...). 
    var metaData = ModelMetadata.FromLambdaExpression(expression, helper.ViewData); 
    var fieldName = ExpressionHelper.GetExpressionText(expression); 

    TagBuilder builder = new TagBuilder("label"); 
    // Generate the id as for the form fields (adds it to self). 
    builder.GenerateId(fieldName); 
    // Use the generated id for the 'for' attribute. 
    builder.Attributes.Add("for", builder.Attributes["id"]); 
    // Remove the id again. 
    builder.Attributes.Remove("id"); 
    builder.SetInnerText(labelText); 
    return MvcHtmlString.Create(builder.ToString()); 
} 

यह मेरी तत्काल समस्या हल करता है, लेकिन यह सवाल का जवाब नहीं देता है कि एमवीसी 2 में कार्यान्वयन ऐसा क्यों दिखता है। अगर इसके लिए कोई कारण है।

वैसे: एचटीएमएल 5 में आईडी/एट्रिब्यूट के लिए वास्तव में संशोधित करने की कोई ज़रूरत नहीं है, क्योंकि यदि आप चाहें तो आईडी को ^~[] जैसा दिखाना पूरी तरह कानूनी है। सभी प्रमुख ब्राउज़र इसका समर्थन करते हैं। यह अच्छी तरह से Mathias Bynens द्वारा समझाया गया है।

अद्यतन 2:

यह सब पर वास्तव में समस्या का समाधान नहीं होता है, के बाद से DefaultModelBinder वैसे भी यह करने के लिए बाध्य नहीं कर सकते। के बाद से यह उत्पन्न शब्दकोशों में नेस्टेड वस्तुओं का उपयोग करना, MVC 2 में फ़ील्ड नाम जनरेटर द्वारा समर्थित होना प्रतीत नहीं होता है:

<input type="text" name="Dict[en]" value="(VALUE)"> 
इसके बजाय क्या मॉडल बांधने की मशीन चाहता है की

:

<input type="hidden" name="Dict[0].Key" value="en"> 
<input type="text" name="Dict[0].Value" value="(VALUE)"> 

अजीब यह है कि इस तरह से बॉक्स से बाहर आता है।

मैं इसके लिए कस्टम मॉडल बांधने की मशीन बनाने की कोशिश की है, लेकिन मैं MVC2 इसका इस्तेमाल करने के लिए जो भी मैं पर इसका इस्तेमाल करने की कोशिश नहीं कर सकते हैं:

ModelBinders.Binders.Add(typeof(IDictionary<string,object>), new DictionaryModelBinder()); 
ModelBinders.Binders.Add(typeof(IDictionary<string,string>), new DictionaryModelBinder()); 
ModelBinders.Binders.Add(typeof(IDictionary), new DictionaryModelBinder()); 
ModelBinders.Binders.Add(typeof(Dictionary), new DictionaryModelBinder()); 

तो अभी ऐसा लगता है इसे वापस करने के लिए की तरह मैन्युअल रूप से नाम विशेषता मानों को छुपाएं .Key फ़ील्ड के साथ।

+0

मैंने वही देखा है। हालांकि मैं कभी दोहराने वाली संरचना में लेबल का उपयोग नहीं करता हूं। मैं एक टेबल का उपयोग करता हूं। क्या आपने इसे फ़ोरैच लूप में आजमाया था? यह कैसे दिखता है? – Stefanvds

+0

मैं वास्तव में इसे फ़ोरैच लूप में उपयोग करता हूं, यह पठनीयता के लिए स्पष्ट कुंजी के साथ एक सरलीकृत उदाहरण था। –

उत्तर

1

MVC intentionally mungs ids with special characters which are significant in jQuery/CSS3 selectors। ऐसा इसलिए है क्योंकि चयनकर्ता वाक्यविन्यास जटिल हो जाता है जब आईडी में "आरक्षित" (jQuery/CSS3 द्वारा) वर्ण होते हैं।

यह name के साथ ऐसा करता है क्योंकि यह आवश्यक नहीं है और बाध्यकारी के रास्ते में आता है।

यह निश्चित रूप से एक बग है यदि LabelFor वास्तव में संबंधित TextBoxFor पर इंगित नहीं करता है। लेकिन मैं तर्क दूंगा कि बग LabelFor में है, TextBoxFor में नहीं।

3

यह एमवीसी 3 में एक बग है कि हम अगली रिलीज (एमवीसी 3 आरटीएम) के लिए फिक्सिंग पर योजना बना रहे हैं। लेबलफोर टैगबिल्डर से गुजरने के लिए उपयोग किए जाने वाले उसी तर्क का उपयोग करके 'फॉर' विशेषता उत्पन्न करने के लिए टैगबिल्डर के माध्यम से जाएगा ताकि वे सरणी और घोंसले के प्रकारों के लिए लाइन अप कर सकें।

हम वर्तमान में आईडी उत्पन्न करने के लिए एचटीएमएल 4.01 स्पेक का उपयोग कर रहे हैं ताकि आप गैर-अक्षरों से शुरू होने वाली आईडी का उपयोग नहीं कर सकें। हम इस बारे में सोचेंगे कि अब सर्वोत्तम दृष्टिकोण क्या होना चाहिए कि मानकों में बदलाव आया है।

+0

यह खोजने के लिए खुशी है कि इसे ठीक करने के लिए चीजों की सूची में है। मैंने पूरी तरह से सफलता के बिना इसे आधा घंटा गुजरना बिताया। अधिक निराश। –

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