Câu trả lời:
@Html.TextBoxFor(m => m.userCode, new { @readonly="readonly" })
Chúng tôi hoan nghênh bạn tạo Trình trợ giúp HTML cho việc này, nhưng đây đơn giản chỉ là một thuộc tính HTML giống như bất kỳ thuộc tính nào khác. Bạn có tạo Trình trợ giúp HTML cho hộp văn bản có các thuộc tính khác không?
@
. Bạn sẽ thường chỉ nhìn thấy nó với các từ khóa phù hợp với HTML thuộc tính (như chỉ đọc, lớp, vv)
@
để sử dụng các thuộc tính phù hợp với từ khóa C # .
@Html.TextBoxFor(m => m.userCode, new { @readonly="readonly", @class="form-control" })
CẬP NHẬT: Bây giờ rất đơn giản để thêm các thuộc tính HTML vào các mẫu trình chỉnh sửa mặc định. Nó cần thay vì làm điều này:
@Html.TextBoxFor(m => m.userCode, new { @readonly="readonly" })
bạn chỉ có thể làm điều này:
@Html.EditorFor(m => m.userCode, new { htmlAttributes = new { @readonly="readonly" } })
Lợi ích: Bạn không phải gọi .TextBoxFor
, v.v. cho các mẫu. Chỉ cần gọi .EditorFor
.
Mặc dù giải pháp của @ Shark hoạt động chính xác, đơn giản và hữu ích, nhưng giải pháp của tôi (tôi luôn sử dụng) là giải pháp này: Tạo một editor-template
giải pháp có thể xử lý readonly
thuộc tính :
EditorTemplates
trong~/Views/Shared/
PartialView
có tênString.cshtml
Điền vào String.cshtml
mã này:
@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" })
}
Trong lớp mô hình, hãy đặt [ReadOnly(true)]
thuộc tính vào các thuộc tính mà bạn muốn trở thành readonly
.
Ví dụ,
public class Model {
// [your-annotations-here]
public string EditablePropertyExample { get; set; }
// [your-annotations-here]
[ReadOnly(true)]
public string ReadOnlyPropertyExample { get; set; }
}
Bây giờ bạn có thể sử dụng cú pháp mặc định của Razor một cách đơn giản:
@Html.EditorFor(m => m.EditablePropertyExample)
@Html.EditorFor(m => m.ReadOnlyPropertyExample)
Cái đầu tiên hiển thị bình thường text-box
như thế này:
<input class="text-box single-line" id="field-id" name="field-name" />
Và thứ hai sẽ hiển thị;
<input readonly="readonly" disabled="disabled" class="text-box single-line readonly" id="field-id" name="field-name" />
Bạn có thể sử dụng giải pháp này cho bất kỳ loại dữ liệu ( DateTime
, DateTimeOffset
, DataType.Text
, DataType.MultilineText
và vân vân). Chỉ cần tạo một editor-template
.
Giải pháp với TextBoxFor là OK, nhưng nếu bạn không muốn thấy trường như EditBox sành điệu (có thể hơi khó hiểu đối với người dùng) thì liên quan đến các thay đổi như sau:
Mã dao cạo trước khi thay đổi
<div class="editor-field">
@Html.EditorFor(model => model.Text)
@Html.ValidationMessageFor(model => model.Text)
</div>
Sau khi thay đổi
<!-- 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>
Nói chung, giải pháp này ngăn trường chỉnh sửa, nhưng hiển thị giá trị của nó. Không cần phải sửa đổi mã phía sau.
Với các khoản tín dụng cho câu trả lời trước của @Bronek và @Shimmy:
Điều này giống như tôi đã làm điều tương tự trong ASP.NET Core:
<input asp-for="DisabledField" disabled="disabled" />
<input asp-for="DisabledField" class="hidden" />
Đầu vào đầu tiên chỉ đọc và đầu vào thứ hai chuyển giá trị đến bộ điều khiển và được ẩn. Tôi hy vọng nó sẽ hữu ích cho những người làm việc với ASP.NET Core.
@Html.TextBox("Receivers", Model, new { @class = "form-control", style = "width: 300px", @readonly = "readonly" })
@Html.TextBoxFor(model => model.IsActive, new { readonly= "readonly" })
Điều này chỉ tốt cho hộp văn bản. Tuy nhiên, nếu bạn cố gắng làm như vậy checkbox
thì hãy thử sử dụng điều này nếu bạn đang sử dụng nó:
@Html.CheckBoxFor(model => model.IsActive, new { onclick = "return false" })
Nhưng đừng sử dụng disable
, vì vô hiệu hóa luôn gửi giá trị mặc định false
đến máy chủ - nó ở trạng thái được chọn hoặc không được chọn. Và readonly
không hoạt động cho hộp kiểm và radio button
. readonly
chỉ hoạt động cho text
các lĩnh vực.
Bạn có thể sử dụng mã dưới đây để tạo TextBox ở dạng chỉ đọc.
Phương pháp 1
@Html.TextBoxFor(model => model.Fields[i].TheField, new { @readonly = true })
Phương pháp 2
@Html.TextBoxFor(model => model.Fields[i].TheField, new { htmlAttributes = new {disabled = "disabled"}})
@
tiền tố của thuộcreadonly
tính. Xem bản chỉnh sửa của tôi.