2008-10-07 42 views
27

Tôi có một chế độ xem MVC mạnh mẽ được đánh máy chịu trách nhiệm về giao diện người dùng nơi người dùng có thể tạo và chỉnh sửa các mục của ứng dụng khách. Tôi muốn họ có thể xác định ClientId khi tạo, nhưng không chỉnh sửa và điều này được phản ánh trong giao diện người dùng.Html.TextBox thuộc tính có điều kiện với ASP.NET MVC Preview 5

Để kết thúc này, tôi có dòng sau:

<%= Html.TextBox("Client.ClientId", ViewData.Model.ClientId, new 
{ @readonly = 
    (ViewData.Model.ClientId != null && ViewData.Model.ClientId.Length > 0 
     ? "readonly" : "false") 
}) 
%> 

Dường như không có vấn đề gì giá trị tôi cung cấp cho các thuộc tính chỉ đọc (thậm chí là "false" và ""), Firefox và IE7 làm cho đầu vào đọc - chỉ, điều này gây khó chịu cho việc truy cập trực quan. Có cách nào tốt đẹp, dựa trên toán tử dựa trên toán tử để loại bỏ hoàn toàn thuộc tính nếu nó không được yêu cầu?

Trả lời

35

vấn đề khó khăn ... Tuy nhiên, nếu bạn muốn xác định chỉ thuộc tính readonly, bạn có thể làm điều đó như thế này:

<%= Html.TextBox("Client.ClientId", ViewData.Model.ClientId, 
    ViewData.Model.ClientId != null && ViewData.Model.ClientId.Length > 0 
    ? new { @readonly = "readonly" } 
    : null) 
%> 

Nếu bạn muốn xác định nhiều thuộc tính thì bạn phải xác định hai loại vô danh và có nhiều bản sao của các thuộc tính. Ví dụ, một cái gì đó như thế này (mà tôi không thích anyway):

ClientId.Length > 0 
    ? (object)new { @readonly = "readonly", @class = "myCSS" } 
    : (object)new { @class = "myCSS" } 
+0

+1 shot đầu tiên của tôi là đoạn mã thứ hai mà không có dàn diễn viên để phản đối.Nó dễ dàng bị bỏ qua nhưng thực sự cần thiết. –

4

Và thay thế chỉ là để phát ra nó như HTML cũ đơn giản. Có, trình soạn thảo sẽ làm cho bạn nghĩ rằng bạn sai, nhưng điều đó dường như xảy ra khá thường xuyên với VS2008SP1. Ví dụ này là đặc biệt cho các hộp kiểm mà dường như hoàn toàn lãng phí trong CTP5, nhưng nó cung cấp cho bạn một ý tưởng làm thế nào để phát ra các thuộc tính có điều kiện.

<input type="checkbox" name="roles" value='<%# Eval("Name") %>' 
    <%# ((bool) Eval("InRole")) ? "checked" : "" %> 
    <%# ViewData.Model.IsInRole("Admin") ? "" : "disabled" %> /> 
1

Tôi nghĩ rằng nó phải được

<%= ((bool) Eval("InRole")) ? "checked" : "" %> 

thay vì điều này trong leppies trả lời.

<%# ((bool) Eval("InRole")) ? "checked" : "" %> 

Ít nhất nó không hoạt động với tôi bằng # nhưng nó hoạt động với =. Tôi có làm gì sai không? Cảm ơn cho mẹo anyway :)

0
$ (function() { $ ("[readonly = 'false']"). RemoveAttr ("readonly"); });
21

Nếu bạn muốn xác định một số thuộc tính và chỉ đọc có điều kiện mà không trùng lặp các thuộc tính khác, bạn có thể sử dụng từ điển thay vì loại ẩn danh cho thuộc tính.

ví dụ:

Dictionary<string, object> htmlAttributes = new Dictionary<string, object>(); 
htmlAttributes.Add("class", "myCSS"); 
htmlAttributes.Add("data-attr1", "val1"); 
htmlAttributes.Add("data-attr2", "val2"); 
if (Model.LoggedInData.IsAdmin == false) 
{ 
    htmlAttributes.Add("readonly", "readonly"); 
} 


@:User: @Html.TextBoxFor(
    m => m.User, 
    htmlAttributes) 
+1

Nên là câu trả lời vì nó tránh được sự lặp lại. –

-2

Tôi đã thử hầu hết các đề xuất ở trên và bây giờ tôi đã đến đơn giản nhất với một dòng duy nhất. Kết hợp 2 đối tượng thuộc tính html ẩn danh bằng cách tuyên bố wither một trong số đó là kiểu "đối tượng".

@Html.TextBoxFor(m => m.Email, !isEdit ? new { id = "email_box" } : new { id = "email_box", @readonly = isEdit ? "readonly" : "false" } as object) 
+0

Điều này không hiệu quả đối với tôi; '@readonly = false' vẫn được hiểu là' readonly' –

2

Mẹo: Chỉ sự hiện diện của thuộc tính chỉ đọc/vô hiệu hóa làm cho phần tử chỉ đọc hoặc vô hiệu hóa trong trình duyệt.

@Html.TextBoxFor(x => x.Name, isReadonly ?(object) new { @readonly = true } : new { /*Some other attributes*/ }) 
+0

tại sao lớp ẩn danh cần được đúc thành đối tượng cho điều kiện đầu tiên của hàm ternary op? Không phải thách thức nó, chỉ cố gắng để hiểu nó. Cảm ơn! – eaglei22

0

tôi sử dụng này:

@Html.TextAreaFor(model => model.ComentarioGestor, comentarioGestor? new { @class = "form-control" } : new { @class = "form-control", @readonly = "readonly" } as object) 
Các vấn đề liên quan