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ć .TextBoxForitp. 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-templatektóry może obsługiwać readonlyatrybut :
EditorTemplatesw~/Views/Shared/PartialViewo nazwieString.cshtmlWypełnij String.cshtmlten 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-boxten 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.MultilineTexti 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, checkboxspró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ą falsedo serwera - albo był w stanie zaznaczonym, albo niezaznaczonym. A readonlynie działa w przypadku pola wyboru i radio button. readonlydziała tylko dla textpó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"}})
@przedrostkareadonlywłaściwości. Zobacz moją edycję.