Phương thức mở rộng EditorFor
nối mô hình của bạn với một phần xem nằm trong tệp EditorTemplates tương ứng với loại Mô hình (vì vậy trong trường hợp này, nó cần phải là Boolean.cshtml
).
Bạn có thể thực hiện mục tiêu của mình bằng cách thêm logic có điều kiện vào Mẫu trình chỉnh sửa. Bạn cũng sẽ cần cung cấp phần nào để biết giá trị của thuộc tính MoreInstructorsAllowed
và bạn có thể sử dụng quá tải EditorFor
với tham số additionalViewData
để chuyển thông tin này.
Thành thật mà nói, việc thay đổi chức năng mặc định của các boolean xử lý có vẻ như hơi nhiều đối với những gì bạn đang cố gắng làm. Nếu hai trường này được liên kết về cơ bản, sẽ có ý nghĩa hơn khi tạo một tổng hợp của hai trường và kết nối một phần khung nhìn với tổng hợp chứ không phải là các boolean. Những gì tôi có nghĩa là:
public class InstructorProperty {
public bool IsInstructor { get; set; }
public bool MoreInstructorsAllowed { get; set; }
}
và trong /Shared/EditorTemplates/InstructorProperty.cshtml
@model InstructorProperty
// ... Your view logic w/ the @if(MoreInstructorsClause) here.
Vấn đề duy nhất là bây giờ bạn đang trở lại ở vấn đề vì phải sử dụng phương pháp CheckboxFor
để áp dụng thuộc tính "bị vô hiệu hóa", vì phương thức EditorFor
không chấp nhận thuộc tính ad hoc html. Có một công việc đã biết xung quanh có liên quan đến việc ghi đè ModelMetadataProvider
của bạn và trang trí thuộc tính với một thuộc tính mà bạn cung cấp xử lý trong ModelMetadataProvider. Một ví dụ làm việc của kỹ thuật này có sẵn tại: http://aspadvice.com/blogs/kiran/archive/2009/11/29/Adding-html-attributes-support-for-Templates-2D00-ASP.Net-MVC-2.0-Beta_2D00_1.aspx. Tuy nhiên, điều đó sẽ liên quan đến: (1) ghi đè chế độ xem Boolean và mã hóa cứng html hoặc sử dụng CheckboxFor trong đó, (2) sử dụng phương thức CheckboxFor
trong chế độ xem InstructorProperty
hoặc (3) mã hóa cứng html vào chế độ xem InstructorProperty
. Tôi không nghĩ rằng nó có ý nghĩa phức tạp hơn thiết kế cho một điều tầm thường như vậy, vì vậy giải pháp của tôi sẽ được sử dụng InstructorProperty
quan điểm này và chỉ cần thêm:
@Html.CheckboxFor(_=>_.IsInstructor,
htmlAttributes: (Model.MoreInstructorsAllowed ? null : new { disabled = "disabled"}).ToString().ToLowerInvariant() });
Nhưng tôi nhận được rằng mọi người đều có phong cách khác nhau ... Một lưu ý khác. Nếu sự ác cảm của bạn khi sử dụng phương thức Hộp kiểm có liên quan đến lược đồ đặt tên được tạo, cách mà Khung Mvc truy cập tính năng này liên quan đến html.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(htmlFieldName)
Tôi đã xem giải pháp tại http://stackoverflow.com/questions/6590663/make-checkbox -disabled-in-asp-net-mvc-2-and-jquery nhưng tôi muốn sử dụng EditorFor thay vì CheckBoxFor –