Odpowiedzi:
@Html.TextBoxFor(m => m.userCode, new { @readonly="readonly" })
Zapraszamy do stworzenia pomocnika HTML do tego, ale jest to po prostu atrybut HTML, jak każdy inny. Czy stworzyłbyś pomocnika HTML dla pola tekstowego, które ma inne atrybuty?
@
. Zwykle zobaczysz go tylko ze słowami kluczowymi pasującymi do atrybutów HTML (takich jak tylko do odczytu, klasa itp.)
@
atrybutów, które pasują do słów kluczowych C # .
@Html.TextBoxFor(m => m.userCode, new { @readonly="readonly", @class="form-control" })
AKTUALIZACJA: Teraz bardzo łatwo jest dodać atrybuty HTML do domyślnych szablonów edytora. Neans zamiast robić to:
@Html.TextBoxFor(m => m.userCode, new { @readonly="readonly" })
po prostu możesz to zrobić:
@Html.EditorFor(m => m.userCode, new { htmlAttributes = new { @readonly="readonly" } })
Korzyści: nie musisz dzwonić .TextBoxFor
itp. Po szablony. Po prostu zadzwoń .EditorFor
.
Chociaż rozwiązanie @ Shark działa poprawnie i jest proste i przydatne, moim rozwiązaniem (którego używam zawsze) jest to: Utwórz atrybut, editor-template
który może obsługiwać readonly
atrybut :
EditorTemplates
w~/Views/Shared/
PartialView
o nazwieString.cshtml
Wypełnij String.cshtml
ten kod:
@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" })
}
W klasie modelu umieść [ReadOnly(true)]
atrybut na właściwościach, którymi chcesz być readonly
.
Na przykład,
public class Model {
// [your-annotations-here]
public string EditablePropertyExample { get; set; }
// [your-annotations-here]
[ReadOnly(true)]
public string ReadOnlyPropertyExample { get; set; }
}
Teraz możesz po prostu użyć domyślnej składni Razor:
@Html.EditorFor(m => m.EditablePropertyExample)
@Html.EditorFor(m => m.ReadOnlyPropertyExample)
Pierwsza renderuje normalność w text-box
ten sposób:
<input class="text-box single-line" id="field-id" name="field-name" />
A drugi odda;
<input readonly="readonly" disabled="disabled" class="text-box single-line readonly" id="field-id" name="field-name" />
Można korzystać z tego rozwiązania dla każdego rodzaju danych ( DateTime
, DateTimeOffset
, DataType.Text
, DataType.MultilineText
i tak dalej). Po prostu utwórz plik editor-template
.
Rozwiązanie z TextBoxFor jest w porządku, ale jeśli nie chcesz widzieć pola takiego jak EditBox stylowy (może to być trochę mylące dla użytkownika), wprowadź następujące zmiany:
Kod Razor przed zmianami
<div class="editor-field">
@Html.EditorFor(model => model.Text)
@Html.ValidationMessageFor(model => model.Text)
</div>
Po zmianach
<!-- 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>
Generalnie to rozwiązanie uniemożliwia edycję pola, ale pokazuje jego wartość. Nie ma potrzeby wprowadzania modyfikacji związanych z kodem.
Z napisami do poprzedniej odpowiedzi autorstwa @Bronek i @Shimmy:
To jest tak, jakbym zrobił to samo w ASP.NET Core:
<input asp-for="DisabledField" disabled="disabled" />
<input asp-for="DisabledField" class="hidden" />
Pierwsze wejście jest tylko do odczytu, a drugie przekazuje wartość do sterownika i jest ukryte. Mam nadzieję, że przyda się komuś pracującemu z ASP.NET Core.
@Html.TextBox("Receivers", Model, new { @class = "form-control", style = "width: 300px", @readonly = "readonly" })
@Html.TextBoxFor(model => model.IsActive, new { readonly= "readonly" })
To jest dobre dla pola tekstowego. Jeśli jednak spróbujesz zrobić to samo dla, checkbox
spróbuj użyć tego, jeśli go używasz:
@Html.CheckBoxFor(model => model.IsActive, new { onclick = "return false" })
Ale nie używaj disable
, ponieważ disable zawsze wysyła wartość domyślną false
do serwera - albo był w stanie zaznaczonym, albo niezaznaczonym. A readonly
nie działa w przypadku pola wyboru i radio button
. readonly
działa tylko dla text
pól.
Możesz użyć poniższego kodu do utworzenia TextBox jako tylko do odczytu.
Metoda 1
@Html.TextBoxFor(model => model.Fields[i].TheField, new { @readonly = true })
Metoda 2
@Html.TextBoxFor(model => model.Fields[i].TheField, new { htmlAttributes = new {disabled = "disabled"}})
@
przedrostkareadonly
właściwości. Zobacz moją edycję.