2012-01-06 13 views

Odpowiedz

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

Zapraszamy dokonać Helper HTML dla tego, ale to jest po prostu tylko atrybut HTML jak każda inna. Czy zrobiłbyś HTML Pomocnik dla pola tekstowego, który ma inne atrybuty?

+1

@Shyju Niestety, brakowało przedrostka '@ 'właściwości' readonly'. Zobacz moją edycję. –

+7

W przyszłości, jeśli pojawi się jakikolwiek błąd dodający właściwości do argumentu obiektu dynamicznego, możesz poprzedzić je znakiem '@'. Zazwyczaj będzie to widoczne tylko dla słów kluczowych pasujących do atrybutów HTML (takich jak readonly, klasa itp.). –

+9

@BradChristie: Nie; potrzebujesz tylko '@' do używania atrybutów pasujących do ** C# ** słów kluczowych. – SLaks

27

AKTUALIZACJA: Teraz bardzo łatwo jest dodać atrybuty html do domyślnych szablonów edytora. Oznacza zamiast robić to:

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

po prostu może to zrobić:

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

Korzyści: masz nie dzwonić .TextBoxFor itp szablonów. Wystarczy zadzwonić pod numer .EditorFor.


Podczas @ rozwiązanie rekina działa poprawnie i to jest proste i użyteczne, moje rozwiązanie (które używam zawsze) jest to jeden Załóż editor-template które mogą uchwyty readonly atrybutów:

  1. Tworzenie Folder o nazwie EditorTemplates w ~/Views/Shared/
  2. Tworzenie brzytwę PartialView nazwie String.cshtml
  3. Napełnić String.cshtml z tym kodem:

    @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. W klasie modelu, umieścić atrybut [ReadOnly(true)] na właściwości, które chcesz mieć readonly.

np.

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

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

Teraz można użyć domyślnego składni noża prosto:

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

pierwsza, świadczy normalne text-box takiego:

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

i drugi, odda;

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

Można użyć tego rozwiązania dla każdego rodzaju danych (DateTime, DateTimeOffset, DataType.Text, DataType.MultilineText i tak dalej). Po prostu stwórz editor-template.

+2

+1, ponieważ użyłeś "ViewData.ModelMetadata.IsReadOnly". Spodziewałem się, że MVC weźmie pod uwagę te rzeczy w wersji 4. – cleftheris

+0

@cleftheris dobrze jesteśmy teraz w wersji 5, a MVC nadal ich nie brało;) –

+1

Bardzo przydatne - dzięki :) – Nildarar

5

Rozwiązanie z TextBoxFor jest OK, ale jeśli nie chcą zobaczyć pola jak okna edycji stylowy (może to być trochę mylące dla użytkownika) pociągać za sobą zmiany następujące:

1. kodu przed Razor zmienia

<div class="editor-field"> 
    @Html.EditorFor(model => model.Text) 
    @Html.ValidationMessageFor(model => model.Text) 
</div> 

2. Po zmian

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

Zasadniczo to rozwiązanie wyłącza się przed edycją, ale pokazuje jej wartość. Nie ma potrzeby wprowadzania zmian kodu.

+1

Myślę, że posiadanie CSS dla klasy editor-field i display-field może być bardzo pomocne. – DOK

1

z kredytów do poprzedniego Odpowiedź @Bronek i @Shimmy

to zrobiłem z samething w ASP.NET Rdzenia

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

Pierwsze wejście jest tylko do odczytu, a druga przechodzi wartość do kontrolera i jest ukryty. Jest to przydatne dla kogoś, kto pracuje z rdzeniem ASP.Net.

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

To dobrze dla pola tekstowego. Jednakże, jeśli starają się zrobić to samo dla checkbox następnie spróbuj użyć tego, jeśli go używać

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

Ale nie używać disable ponieważ wyłączenie zawsze wysłać domyślną wartość false do serwera albo został w zaznaczone lub odznaczone stan. I readonly nie działa dla checkbox i radio button. readonly działa tylko dla pól text.

Powiązane problemy