ASP.NET MVC3 रेजर में एक आसानी से टेक्स्टबॉक्स कैसे बनाया जाए


118

मैं ASP.NET MVC3 में रेजर व्यू इंजन के साथ एक आसानी से टेक्स्टबॉक्स कैसे बना सकता हूं?

क्या ऐसा करने के लिए HTMLHelper विधि उपलब्ध है?

निम्नलिखित जैसा कुछ?

@Html.ReadOnlyTextBoxFor(m => m.userCode)

जवाबों:


246
@Html.TextBoxFor(m => m.userCode, new { @readonly="readonly" })

इसके लिए एक HTML हेल्पर बनाने के लिए आपका स्वागत है, लेकिन यह किसी भी अन्य की तरह केवल एक HTML विशेषता है। क्या आप एक टेक्स्ट बॉक्स के लिए एक HTML हेल्पर बनाएंगे जिसमें अन्य विशेषताएँ हों?


1
@Shyju क्षमा करें, मुझे संपत्ति @का उपसर्ग याद आ रहा था readonly। मेरा संपादन देखें।

7
भविष्य में, यदि आपको गतिशील ऑब्जेक्ट तर्क में गुणों को जोड़ने में किसी भी प्रकार की त्रुटियां मिलती हैं, तो आप उनके साथ उपसर्ग कर सकते हैं @। आप आमतौर पर इसे केवल HTML विशेषताओं से मेल खाने वाले कीवर्ड (जैसे कि आसानी से, कक्षा, आदि) के साथ देख सकते हैं
ब्रैड क्रिस्टी

10
@ ब्रैडक्रिस्टी: नहीं; आपको केवल C # कीवर्ड से @मेल खाने वाली विशेषताओं का उपयोग करने की आवश्यकता है
SLAKs

1
@ ब्रैडक्रिस्टी: मैंने आपकी टिप्पणी को गलत बताया ("कीवर्ड्स" अस्पष्ट था)
SLaks

1
यदि आपके पास कई html विशेषताएँ हैं, तो आप कुछ ऐसा कर सकते हैं:@Html.TextBoxFor(m => m.userCode, new { @readonly="readonly", @class="form-control" })
benscabbia

32

अद्यतन: अब डिफ़ॉल्ट संपादक टेम्प्लेट में HTML विशेषताओं को जोड़ना बहुत आसान है। ऐसा करने के बजाय यह अच्छा है:

@Html.TextBoxFor(m => m.userCode, new { @readonly="readonly" })

आप बस यह कर सकते हैं:

@Html.EditorFor(m => m.userCode, new { htmlAttributes = new { @readonly="readonly" } })

लाभ: आप .TextBoxForटेम्प्लेट आदि के लिए कॉल नहीं कर सकते हैं । बस बुलाओ .EditorFor


जबकि @ शार्क का समाधान सही तरीके से काम करता है, और यह सरल और उपयोगी है, मेरा समाधान (जो मैं हमेशा उपयोग करता हूं) यह एक है: एक बनाएं जो विशेषता editor-templateको संभाल सकता हैreadonly :

  1. EditorTemplatesमें नामक एक फ़ोल्डर बनाएँ~/Views/Shared/
  2. PartialViewनाम का रेजर बनाएंString.cshtml
  3. String.cshtmlइस कोड को भरें :

    @if(ViewData.ModelMetadata.IsReadOnly) {
        @Html.TextBox("", ViewData.TemplateInfo.FormattedModelValue,
            new { @class = "text-box single-line readonly", @readonly = "readonly", disabled = "disabled" })
    } else {
        @Html.TextBox("", ViewData.TemplateInfo.FormattedModelValue,
            new { @class = "text-box single-line" })
    }
  4. मॉडल वर्ग में, उन [ReadOnly(true)]गुणों पर विशेषता डालें, जो आप बनना चाहते हैं readonly

उदाहरण के लिए,

public class Model {
    // [your-annotations-here]
    public string EditablePropertyExample { get; set; }

    // [your-annotations-here]
    [ReadOnly(true)]
    public string ReadOnlyPropertyExample { get; set; }
}

अब आप रेजर के डिफ़ॉल्ट सिंटैक्स का उपयोग कर सकते हैं:

@Html.EditorFor(m => m.EditablePropertyExample)
@Html.EditorFor(m => m.ReadOnlyPropertyExample)

पहले एक text-boxइस तरह एक सामान्य प्रदान करता है :

<input class="text-box single-line" id="field-id" name="field-name" />

और दूसरा करने के लिए प्रस्तुत करना होगा;

<input readonly="readonly" disabled="disabled" class="text-box single-line readonly" id="field-id" name="field-name" />

आप डेटा के किसी भी प्रकार के लिए इस समाधान का उपयोग कर सकते हैं ( DateTime, DateTimeOffset, DataType.Text, DataType.MultilineTextऔर इतने पर)। बस एक बनाएँ editor-template


2
+1 क्योंकि आपने "ViewData.ModelMetadata.IsReadOnly" का उपयोग किया है। मैं उम्मीद कर रहा था कि MVC इन सामानों को संस्करण 4 में ध्यान में
रखेगा

@cleftheris अच्छी तरह से अब हम 5 संस्करण में हैं, और MVC अभी भी उन्हें नहीं लिया है;)
ravy amiry

2
@Javad_Amiry - महान जवाब - मैंने इसे लागू किया है और जब तक मैंने स्कैफोल्डेड एडिट पेज पर सेव पर क्लिक नहीं किया, तब तक यह बहुत अच्छा लग रहा था। फिर यह गुण [ReadOnly (सच)] के साथ निकलता है, जिसके परिणामस्वरूप NULL को वास्तविक संपत्ति मान के बजाय डेटाबेस में भेजा जाएगा - क्या आप इस पार आए हैं?
पर्सी

5

TextBoxFor के साथ समाधान ठीक है, लेकिन अगर आप EditBox स्टाइलिश जैसे क्षेत्र को नहीं देखना चाहते हैं (यह उपयोगकर्ता के लिए थोड़ा भ्रमित हो सकता है) में निम्नानुसार परिवर्तन शामिल हैं:

  1. बदलाव से पहले रेजर कोड

    <div class="editor-field">
         @Html.EditorFor(model => model.Text)
         @Html.ValidationMessageFor(model => model.Text)
    </div>
  2. बदलाव के बाद

    <!-- New div display-field (after div editor-label) -->
    <div class="display-field">
        @Html.DisplayFor(model => model.Text)
    </div>
    
    <div class="editor-field">
        <!-- change to HiddenFor in existing div editor-field -->
        @Html.HiddenFor(model => model.Text)
        @Html.ValidationMessageFor(model => model.Text)
    </div>

आम तौर पर, यह समाधान फ़ील्ड को संपादन से रोकता है, लेकिन इसका मूल्य दिखाता है। कोड-पीछे संशोधनों की कोई आवश्यकता नहीं है।


1
मुझे लगता है कि यहां संपादक-क्षेत्र और प्रदर्शन-क्षेत्र के लिए CSS होने से वास्तव में मदद मिल सकती है।
DOK

"एडिटिंग के खिलाफ दायर इस समाधान को अक्षम करता है ", इसका क्या मतलब है (यह समझ से बाहर है)? कृपया अपने उत्तर को संपादित करके जवाब दें , यहाँ टिप्पणियों में (उपयुक्त के रूप में) नहीं।
पीटर मोर्टेंसन

3

@Bronek और @ शमी द्वारा पिछले उत्तर के लिए क्रेडिट के साथ:

यह ऐसा ही है जैसे मैंने ASP.NET Core में यही काम किया है:

<input asp-for="DisabledField" disabled="disabled" />
<input asp-for="DisabledField" class="hidden" />

पहला इनपुट पठनीय है और दूसरा नियंत्रक को मान देता है और छिपाया जाता है। मुझे उम्मीद है कि यह ASP.NET कोर के साथ काम करने वाले किसी व्यक्ति के लिए उपयोगी होगा।



0
@Html.TextBoxFor(model => model.IsActive, new { readonly= "readonly" })

यह टेक्स्ट बॉक्स के लिए ठीक है। हालाँकि, यदि आप इसका checkboxउपयोग करने की कोशिश करते हैं तो यदि आप इसका उपयोग कर रहे हैं, तो इसका उपयोग करें:

@Html.CheckBoxFor(model => model.IsActive, new { onclick = "return false" })

लेकिन उपयोग न करें disable, क्योंकि अक्षम falseसर्वर पर हमेशा डिफ़ॉल्ट मान भेजता है - या तो यह जाँच या अनियंत्रित स्थिति में था। और readonlyचेकबॉक्स और के लिए काम नहीं करता है radio buttonreadonlyकेवल textखेतों के लिए काम करता है ।


ड्रॉप डाउन सूची के बारे में क्या?
user3020047

आशा है कि यह मदद कर सकता है stackoverflow.com/questions/1636103/…
gdmanandamohon

0

आप टेक्स्टबॉक्स बनाने के लिए नीचे दिए गए कोड का उपयोग केवल पढ़ने के लिए कर सकते हैं।

विधि 1

 @Html.TextBoxFor(model => model.Fields[i].TheField, new { @readonly = true })

विधि 2

@Html.TextBoxFor(model => model.Fields[i].TheField, new { htmlAttributes = new {disabled = "disabled"}})
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.