ASP.NET MVC3 Razor'da salt okunur bir metin kutusu oluşturma


118

Razor görünüm altyapısıyla ASP.NET MVC3'te salt okunur bir metin kutusu nasıl oluşturabilirim?

Bunu yapmak için mevcut bir HTMLHelper yöntemi var mı?

Aşağıdaki gibi bir şey?

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

Yanıtlar:


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

Bunun için bir HTML Yardımcısı yapabilirsiniz, ancak bu sadece diğerleri gibi bir HTML özelliğidir. Başka özniteliklere sahip bir metin kutusu için bir HTML Yardımcısı oluşturur muydunuz?


1
@Shyju Üzgünüm, özelliğin @önekini bulamadım readonly. Düzenlememe bakın.

7
Gelecekte, dinamik nesne bağımsız değişkenine özellikler eklerken herhangi bir tür hata alırsanız, bunların önüne @. Bunu genellikle yalnızca HTML özellikleriyle eşleşen anahtar kelimelerle (salt okunur, sınıf vb.) Görürsünüz
Brad Christie

10
@BradChristie: Hayır; yalnızca C # anahtar kelimeleriyle @eşleşen öznitelikleri kullanmanız gerekir .
SLaks

1
@BradChristie: Yorumunuzu yanlış okudum ("anahtar kelimeler" belirsizdi)
SLaks

1
Birden fazla html özelliğiniz varsa aşağıdakilere benzer bir şey yapabilirsiniz:@Html.TextBoxFor(m => m.userCode, new { @readonly="readonly", @class="form-control" })
benscabbia

32

GÜNCELLEME: Varsayılan düzenleyici şablonlarına HTML nitelikleri eklemek artık çok basit. Bunu yapmak yerine neans:

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

basitçe bunu yapabilirsiniz:

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

Faydaları: .TextBoxForŞablonlar için arama vb. Zorunda değilsiniz . Sadece ara .EditorFor.


@ Shark'ın çözümü doğru çalışmasına ve basit ve kullanışlı olmasına rağmen benim çözümüm (her zaman kullandığım) şudur: Özniteliği işleyebilen bireditor-templatereadonly çözüm oluşturun :

  1. Adlı bir klasör oluşturun EditorTemplatesiçinde~/Views/Shared/
  2. PartialViewAdlı bir jilet oluşturunString.cshtml
  3. String.cshtmlBu kodu doldurun :

    @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. Model sınıfında, [ReadOnly(true)]özniteliği olmak istediğiniz özelliklere koyun readonly.

Örneğin,

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

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

Artık Razor'un varsayılan sözdizimini basitçe kullanabilirsiniz:

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

İlki şu şekilde normaldir text-box:

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

Ve ikincisi;

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

Sen her veri türü için bu çözümü kullanabilirsiniz ( DateTime, DateTimeOffset, DataType.Text, DataType.MultilineTextvb). Sadece bir editor-template.


2
"ViewData.ModelMetadata.IsReadOnly" kullandığınız için +1.
MVC'nin

@cleftheris iyi, şu anda sürüm 5'teyiz ve MVC hala onları almadı;)
ravy amiry

2
@Javad_Amiry - harika cevap - Onu uyguladım ve İskele Düzenleme sayfasında Kaydet'e tıklayana kadar harika çalışıyor gibi görünüyordu. Ardından, [ReadOnly (true)] olan Özellikler, veritabanına gerçek Özellik değeri yerine NULL gönderilmesine neden olur - Bununla karşılaştınız mı?
Percy

5

TextBoxFor ile çözüm tamam, ancak alanı EditBox şık olarak görmek istemiyorsanız (kullanıcı için biraz kafa karıştırıcı olabilir) aşağıdaki değişiklikleri içerir:

  1. Değişikliklerden önce jilet kodu

    <div class="editor-field">
         @Html.EditorFor(model => model.Text)
         @Html.ValidationMessageFor(model => model.Text)
    </div>
  2. Değişikliklerden sonra

    <!-- 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>

Genel olarak, bu çözüm alanın düzenlenmesini engeller ancak değerini gösterir. Arka planda kodlama değişikliklerine gerek yoktur.


1
Burada sınıf editör alanı ve görüntüleme alanı için CSS'ye sahip olmanın gerçekten yararlı olabileceğini düşünüyorum.
DOK

"Bu çözüm düzenlemeye karşı dosyaları devre dışı bırakır" ile ne demek istiyorsun (anlaşılmaz görünüyor)? Lütfen yanıtınızı burada yorumlarda değil (uygun şekilde) düzenleyerek yanıtlayın .
Peter Mortensen

3

@Bronek ve @Shimmy tarafından verilen önceki cevaba kredilerle:

ASP.NET Core'da aynı şeyi yaptığım gibi:

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

İlk giriş salt okunurdur ve ikincisi değeri kontrolöre iletir ve gizlenir. Umarım ASP.NET Core ile çalışan biri için faydalı olur.


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

1
Bir açıklama sırayla olacaktır.
Peter Mortensen

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

Bu metin kutusu için gayet iyi. Ancak, aynı şeyi yapmaya checkboxçalışırsanız, kullanıyorsanız, bunu kullanmayı deneyin:

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

Ancak kullanmayın disable, çünkü devre dışı bırakma her zaman varsayılan değeri falsesunucuya gönderir - ya işaretli ya da işaretlenmemiş durumdaydı. Ve readonlyonay kutusu için çalışmaz ve radio button. readonlyyalnızca textalanlar için çalışır .


Açılır listeler ne olacak?
user3020047


0

Salt okunur olarak bir TextBox oluşturmak için aşağıdaki kodu kullanabilirsiniz.

Yöntem 1

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

Yöntem 2

@Html.TextBoxFor(model => model.Fields[i].TheField, new { htmlAttributes = new {disabled = "disabled"}})
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.