c# - एएसपी.नेट एमवीसी 3 रेजर में रीडोनली टेक्स्टबॉक्स कैसे बनाएं




asp.net-mvc-3 razor (5)

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

कुछ इस तरह ?

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


@ ब्रोनक और @ शिमी द्वारा पिछले उत्तर में क्रेडिट के साथ

यह मैंने एएसपी.नेट कोर में समीकरण किया है

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

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


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

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>

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


अद्यतन: अब डिफ़ॉल्ट संपादक टेम्पलेट्स में 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. String.cshtml नामक रेज़र 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 DateTime , डेटा टाइप टाइप। बस एक editor-template बनाएं।


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

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

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

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

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





readonlyattribute