2012-01-06 18 views

Trả lời

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

Bạn được chào đón để làm cho một Helper HTML cho điều này, nhưng điều này chỉ đơn giản chỉ là một thuộc tính HTML giống như bất kỳ khác. Bạn có tạo một Trình trợ giúp HTML cho một 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 tính 'readonly'. Xem chỉnh sửa của tôi. –

+7

Trong tương lai, nếu bạn nhận được bất kỳ loại lỗi nào thêm thuộc tính vào đối số động, bạn có thể thêm tiền tố cho chúng bằng '@'. Thông thường, bạn sẽ chỉ thấy từ khóa khớp với các thuộc tính HTML (như chỉ đọc, lớp, v.v.) –

+9

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

27

CẬP NHẬT: Bây giờ, việc thêm thuộc tính html vào mẫu trình chỉnh sửa mặc định rất đơn giản. Có nghĩa là 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 có không gọi .TextBoxFor vv cho các mẫu. Chỉ cần gọi .EditorFor.


Trong khi @ giải pháp Shark của hoạt động chính xác và nó là đơn giản và hữu ích, giải pháp của tôi (mà tôi sử dụng luôn luôn) là này một Tạo một editor-template có thể xử lý readonly thuộc tính:

  1. Tạo thư mục có tên EditorTemplates trong ~/Views/Shared/
  2. Tạo một dao cạo PartialView tên String.cshtml
  3. Điền vào String.cshtml với 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" }) 
    } 
    
  4. Trong lớp mô hình, đặt thuộc tính [ReadOnly(true)] trên tài sản 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 dao cạo chỉ đơn giản:

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

Người đầu tiên, làm cho một 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ẽ trả cho;

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

+2

+1 vì bạn đã sử dụng "ViewData.ModelMetadata.IsReadOnly". Tôi đã mong đợi MVC sẽ đưa vào tài khoản những thứ này trong phiên bản 4. – cleftheris

+0

@cleftheris chúng tôi đang trong phiên bản 5 bây giờ, và MVC vẫn không đưa họ;) –

+1

Rất hữu ích - cảm ơn :) – Nildarar

5

Các giải pháp với TextBoxFor là OK nhưng nếu bạn không muốn nhìn thấy lĩnh vực này như EditBox phong cách (nó có thể là chút nhầm lẫn cho người dùng) liên quan đến những thay đổi như sau:

1. Mã Razor trước 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 vô hiệu hóa đệ trình chống lại chỉnh sửa nhưng cho thấy giá trị của nó. Không cần sửa đổi mã.

+1

Tôi nghĩ rằng việc có CSS ​​cho trường trình soạn thảo các lớp và trường hiển thị ở đây có thể thực sự hữu ích. – DOK

1

với tín dụng cho các câu trả lời trước bởi @Bronek và @Shimmy

này là tôi đã làm samething trong ASP.NET Lõi

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

Các đầu vào đầu tiên là chỉ đọc và điều thứ hai vượt qua giá trị để điều khiển và được ẩn.Hope nó sẽ hữu ích cho một người làm việc với ASP.Net Core.

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

Đây chỉ là tốt cho hộp văn bản. Tuy nhiên, nếu bạn cố gắng làm tương tự cho các checkbox sau đó hãy thử sử dụng này nếu bạn 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 các giá trị mặc định sai đến máy chủ hoặc là nó được trong kiểm tra hoặc không được kiểm soát tiểu bang. Và readonly không hoạt động đối với hộp kiểm và radio button. readonly chỉ hoạt động đối với các trường text.