Cách tạo hộp văn bản chỉ đọc trong ASP.NET MVC3 Razor


118

Làm cách nào để tạo hộp văn bản chỉ đọc trong ASP.NET MVC3 với công cụ chế độ xem Razor?

Có phương pháp HTMLHelper nào để làm điều đó không?

Một cái gì đó như sau?

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

Câu trả lời:


246
@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?


1
@Shyju Xin lỗi, tôi đã thiếu @tiền tố của thuộc readonlytính. Xem bản chỉnh sửa của tôi.

7
Trong tương lai, nếu bạn gặp bất kỳ loại lỗi nào khi thêm thuộc tính vào đối số đối tượng động, bạn có thể đặt trước chúng bằ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)
Brad Christie

10
@BradChristie: Không; bạn chỉ cần một @để sử dụng các thuộc tính phù hợp với từ khóa C # .
SLaks

1
@BradChristie: Tôi không nhận định bình luận của bạn ( "từ khóa" là mơ hồ)
SLaks

1
Nếu bạn có nhiều thuộc tính html bạn có thể làm như sau:@Html.TextBoxFor(m => m.userCode, new { @readonly="readonly", @class="form-control" })
benscabbia

32

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-templategiải pháp có thể xử lý readonlythuộc tính :

  1. Tạo một thư mục có tên EditorTemplatestrong~/Views/Shared/
  2. Tạo một dao cạo râu PartialViewcó tênString.cshtml
  3. Điền vào String.cshtmlmã 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" })
    }
  4. 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-boxnhư 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.MultilineTextvà vân vân). Chỉ cần tạo một editor-template.


2
+1 vì bạn đã sử dụng "ViewData.ModelMetadata.IsReadOnly". Tôi đã chờ đợi MVC sẽ đưa vào tài khoản các công cụ trong phiên bản 4.
cleftheris

@cleftheris à, chúng ta đang ở phiên bản 5 bây giờ và MVC vẫn không lấy chúng;)
ravy amiry

2
@Javad_Amiry - câu trả lời tuyệt vời - Tôi đã triển khai nó và nó có vẻ hoạt động tuyệt vời cho đến khi tôi nhấp vào Lưu trên trang Chỉnh sửa được xếp gọn. Sau đó, hóa ra Thuộc tính với [ReadOnly (true)] sẽ dẫn đến việc NULL được gửi đến cơ sở dữ liệu thay vì giá trị Thuộc tính thực - Bạn đã xem điều này chưa?
Percy

5

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:

  1. Mã dao cạo trước khi thay đổi

    <div class="editor-field">
         @Html.EditorFor(model => model.Text)
         @Html.ValidationMessageFor(model => model.Text)
    </div>
  2. 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.


1
Tôi nghĩ rằng việc có CSS ​​cho trường biên tập lớp và trường hiển thị ở đây có thể thực sự hữu ích.
DOK

Ý bạn là gì khi "giải pháp này vô hiệu hóa việc nộp đơn chống lại việc chỉnh sửa", (có vẻ không thể hiểu được)? Vui lòng trả lời bằng cách chỉnh sửa câu trả lời của bạn , không phải ở đây trong nhận xét (nếu thích hợp).
Peter Mortensen

3

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.


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

1
Một lời giải thích sẽ được theo thứ tự.
Peter Mortensen

0
@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 checkboxthì 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à readonlykhông hoạt động cho hộp kiểm và radio button. readonlychỉ hoạt động cho textcác lĩnh vực.


Điều gì về danh sách thả xuống?
user3020047

Hy vọng điều này có thể giúp stackoverflow.com/questions/1636103/…
gdmanandamohon

0

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"}})
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.