2012-06-06 68 views
5

Tôi đang làm việc trong ASP.NET MVC3 bằng cách sử dụng Razor. Tôi có một tình huống mà tôi muốn kích hoạt một hộp kiểm dựa trên một thuộc tính boolean. lớp mô hình của tôi có 2 thuộc tính như:ASP.NET MVC3 @ Html.EditorFor Checkbox vô hiệu hoá kích hoạt

public bool IsInstructor { get; set; } 
public bool MoreInstructorsAllowed { get; set; } 

Bây giờ trong file cshtml của tôi, tôi thấy hộp kiểm như:

@Html.EditorFor(model => model.IsInstructor) 

Tôi muốn hộp kiểm này để cho phép vô hiệu hóa trên cơ sở tài sản MoreInstructorsAllowed. Cảm ơn trước vì giải pháp. :)

+0

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 –

Trả lời

3

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)

+0

cảm ơn rất nhiều cho câu trả lời chi tiết này, nhưng nếu chúng ta sử dụng CheckboxFor, hơn thuộc tính MoreInstructorsAllowed sẽ phải là chuỗi? vì thuộc tính bị vô hiệu hóa không thể đúng hoặc sai, nó có thể bị tắt và bật. –

+0

Điều đó là chính xác. Tôi đã sửa đổi câu trả lời của mình. – smartcaveman

Các vấn đề liên quan