2012-01-31 16 views
26

मेरे पास सी # नेट वेब ऐप है। उस ऐप में मुझे सिस्टम में लॉग इन करने के आधार पर Html.TextBoxFor नियंत्रण (Html.DropDownListFor नियंत्रण) को सशर्त रूप से अक्षम करने की आवश्यकता है। मैंएमवीसी 3 सशर्त रूप से एचटीएमएल अक्षम करें। टेक्स्टबॉक्स फोर()

@Html.TextBoxFor(model => model.ProposalName, new { @ViewBag.IsDisabled }) 

कहाँ @ViewBag.IsDisabled नियंत्रक में या तो String.Empty या "अक्षम" पर सेट है उपयोग करने की कोशिश। हालांकि, यह IsDisabled='disabled' या IsDisabled="" के रूप में प्रस्तुत करता है इसलिए नियंत्रण अक्षम नहीं है। जब मैं

@Html.TextBoxFor(model => model.ProposalName, new { @ViewBag.Disabled }) 

की कोशिश की नियंत्रण हमेशा अक्षम किया गया था, भले ही ViewBag.Disabled कोई पाठ होता है। मैं Html.TextBoxFor() नियंत्रण को सशर्त रूप से अक्षम कैसे कर सकता हूं?

उत्तर

51

@Html.TextBoxFor(model => model.ProposalName, ViewBag.Disabled ? (object)new { disabled="disabled" } : new {}) 
+0

@epig .... दिलचस्प। ViewBag का मूल्य क्या होना चाहिए। अक्षम होना चाहिए? – MikeTWebb

+1

@MikeTWebb ViewBag.Disabled एक बूलियन मान होना चाहिए। – epignosisx

+0

@epig .... सही या गलत मान हैं। बहुत अच्छा काम करता है! धन्यवाद – MikeTWebb

19

समाधान @epignosisx काम करता है के द्वारा पोस्ट की कोशिश करें, लेकिन आप कुछ अन्य विशेषता जोड़ने के लिए है क्योंकि आप होगा यह यह दोनों वस्तुओं (disabled के साथ एक जोड़ना चाहते हैं तो यह एक समस्या हो सकता है और हो सकता है अब एक खाली है)।

यदि आपके पास कुछ अन्य बूल संपत्ति है तो भी बदतर है क्योंकि आपके पास प्रत्येक संयोजन के लिए चार अलग-अलग वस्तुएं होंगी।

यहां सबसे अच्छा समाधान (थोड़ा और कोड के साथ) एचटीएमएलहेल्पर के लिए एक पैरामीटर के रूप में अपनी बूलियन संपत्ति प्राप्त करने के लिए एक विस्तार विधि बनाना है।

public static MvcHtmlString TextBoxDisabledFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, bool disabled, object htmlAttributes = null) 
{ 
    return TextBoxDisabledFor(htmlHelper, expression, disabled, HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes)); 
} 

public static MvcHtmlString TextBoxDisabledFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, bool disabled, IDictionary<string, object> htmlAttributes) 
{ 
    if (htmlAttributes == null) 
     htmlAttributes = new Dictionary<string, object>(); 
    if (disabled) 
     htmlAttributes["disabled"] = "disabled"; 
    return htmlHelper.TextBoxFor(expression, htmlAttributes); 
} 

Here there is another example

8

मैं इस एक ही समस्या थी और मेरे अपने HtmlHelper विस्तार विधि लिखने का फैसला किया।

public static MvcHtmlString Disable(this MvcHtmlString helper, bool disabled) 
    { 
     if (helper == null) 
      throw new ArgumentNullException(); 

     if (disabled) 
     { 
      string html = helper.ToString(); 
      int startIndex = html.IndexOf('>'); 

      html = html.Insert(startIndex, " disabled=\"disabled\""); 
      return MvcHtmlString.Create(html); 
     } 

     return helper; 
    } 

यह इंगित करने के लिए एक बूलियन स्वीकार करेगा कि नियंत्रण अक्षम किया जाना चाहिए या नहीं। यह केवल disabled="disabled" को पहले > के अंदर जोड़ता है जो यह एक स्ट्रिंग में आता है।

आप इसे नीचे की तरह उपयोग कर सकते हैं।

@Html.TextBoxFor(model => model.ProposalName).Disable(true)

+0

के लिए उपयोगी है बहुत अच्छा ...... – Bohn

5

यहाँ विधि मैं उपयोग करते हैं, कौन से विस्तार की आवश्यकता नहीं है, और आप केवल एक एचटीएमएल विशेषता को सीमित नहीं करता। यह मान लिया गया एक बूलियन संपत्ति "अक्षम" अपने मॉडल में नामित किया गया है, लेकिन आप, वहाँ में डाल सकता है आप जो कुछ भी चाहता था जब तक यह त्रिगुट ऑपरेटर के लिए बूलियन का मूल्यांकन:

@Html.TextBoxFor(model => model.Whatever, 
    new Dictionary<string, object>() { 
    { "size", "5" }, 
    { "class", "someclasshere" }, 
    { model.Disabled ? "disabled" : "data-notdisabled", "disabled" } 
    }) 

मानक शॉर्टकट के साथ सीमा नोटेशन यह है कि विशेषता का नाम गतिशील नहीं हो सकता है। सही प्रकार का शब्दकोश बनाकर, आप विशेषता नाम को गतिशील बना सकते हैं, और उसके बाद आप उस शब्दकोष को टेक्स्टबॉक्स में विशेषताओं के शब्दकोश के रूप में पास कर सकते हैं। जब फ़ील्ड को अक्षम नहीं किया जाता है, तो यह "अक्षम" नाम की एक विशेषता के बजाय "डेटा-अस्वीकृत" नामक एक विशेषता को पास करता है, जिसे ब्राउज़र तब अनदेखा कर देगा।

2

विस्तार @ जेम्स का जवाब, मैं इस HtmlHelper विस्तार है कि अद्यतन/को हटा disabled विशेषता अगर यह पहले से ही मौजूद है लिखा है, या यह कहते हैं अगर नहीं:

public static MvcHtmlString Disable(this MvcHtmlString helper, bool disabled) { 
    string html = helper.ToString(); 
    var regex = new Regex("(disabled(?:=\".*\")?)"); 
    if (regex.IsMatch(html)) { 
     html = regex.Replace(html, disabled ? "disabled=\"disabled\"" : "", 1); 
    } else { 
     regex = new Regex(@"(\/?>)"); 
     html = regex.Replace(html, disabled ? "disabled=\"disabled\"$1" : "$1", 1); 
    } 
    return MvcHtmlString.Create(html); 
} 

यह भी स्वत: बंद होने टैग के साथ अच्छी तरह से खेलता है (जैसे <input />)।

प्रयोग एक ही है:

@Html.TextBoxFor(model => model.PropertyName).Disable(true) 

@Html.DropDownListFor() और @Html.TextBoxFor() दोनों पर परीक्षण किया गया।

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