2012-01-06 17 views
94

में रीडोनली टेक्स्टबॉक्स कैसे बनाएं, एएसपी.नेट एमवीसी 3 में रीडोनली टेक्स्टबॉक्स कैसे बनाएं, रेजर व्यू इंजन के साथ? क्या ऐसा करने के लिए कोई HTMLHelper विधि उपलब्ध है?एएसपी.नेट एमवीसी 3 रेजर

ऐसा कुछ?

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

उत्तर

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

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

+1

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

+7

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

+9

@ ब्रैड क्रिस्टी: नहीं; आपको ** सी # ** कीवर्ड से मेल खाने वाले विशेषताओं का उपयोग करने के लिए केवल '@' की आवश्यकता है। – SLaks

27

अद्यतन: अब डिफ़ॉल्ट संपादक टेम्पलेट्स में 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. एक बनाएं फ़ोल्डर ~/Views/Shared/
  2. में EditorTemplates नाम के एक उस्तरा 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 होना चाहता हूँ पर [ReadOnly(true)] विशेषता डाल दिया।

उदा। ,

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

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

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

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

अब आप रेजर के डिफ़ॉल्ट वाक्य रचना बस का उपयोग कर सकते

<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" का उपयोग किया था। मैं उम्मीद कर रहा था कि एमवीसी इन चीजों को संस्करण 4 में ध्यान में रखेगा। – cleftheris

+0

@cleftheris अच्छी तरह से हम अब संस्करण 5 में हैं, और एमवीसी अभी भी उन्हें नहीं ले गया है;) –

+1

बहुत उपयोगी - धन्यवाद :) – Nildarar

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

मुझे लगता है कि क्लास एडिटर-फील्ड और डिस्प्ले-फील्ड के लिए सीएसएस रखना वास्तव में सहायक हो सकता है। – DOK

1
@Bronek और @Shimmy

द्वारा पिछले जवाब देने के लिए क्रेडिट के साथ

यह मैं ASP.NET कोर में samething किया है है

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

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

0
@Html.TextBox("Recivers", Model, new { @class = "form-control", style = "width: 300px", @readonly = "readonly" }) 
0
@Html.TextBoxFor(model => model.IsActive, new { readonly= "readonly" }) 

इस पाठ बॉक्स के लिए ठीक है। हालांकि, अगर आप checkbox के लिए भी ऐसा ही करने की कोशिश तो अगर आप इसे

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

का उपयोग कर इस का उपयोग करके देखें लेकिन disable का प्रयोग नहीं करते क्योंकि अक्षम हमेशा सर्वर या तो उस में जांच की गई या अनियंत्रित करने के लिए झूठी डिफ़ॉल्ट मान भेज राज्य। और readonly चेकबॉक्स और radio button के लिए काम नहीं करता है। readonly केवल text फ़ील्ड के लिए काम करता है।

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