2012-03-08 31 views
10

Tôi đang cố gắng để viết một phần mở rộng cho DropDownListFor:Làm thế nào để thêm htmlattributes bổ sung trong phần mở rộng cho DropDownListFor

public static MvcHtmlString DropDownListFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, IEnumerable<SelectListItem> selectList, object htmlAttributes, bool enabled) 
{ 
    return htmlHelper.DropDownListFor(expression, selectList, null /* optionLabel */, HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes)); 
} 

Những gì tôi muốn đạt được nếu được kích hoạt là sai không thay đổi nhưng nếu được kích hoạt đúng Tôi muốn thêm @disabled="disabled" vào thuộc tính html trước khi đưa chúng đến AnonymousObjectToHtmlAttributes.

Bất kỳ ý tưởng nào về cách thực hiện việc này?

Trả lời

30

Đơn giản! HtmlHelper.AnonymousObjectToHtmlAttributes trả về RouteValueDictionary. Bạn có thể thêm giá trị cho từ điển đó, bạn không cần thêm thuộc tính vào đối tượng ẩn danh.

public static MvcHtmlString DropDownListFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, IEnumerable<SelectListItem> selectList, object htmlAttributes, bool enabled) 
{ 
    var attrs = HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes); 
    if (!enabled) 
    { 
     attrs.Add("disabled", "disabled"); 
    } 
    return htmlHelper.DropDownListFor(expression, selectList, null /* optionLabel */, attrs); 
} 
+3

Không cần phải viết một helper, chỉ cần sử dụng quá tải mà chấp nhận htmlAttributes như Dmitry gợi ý. – RickAndMSFT

+2

@ Rick.Anderson-at-Microsoft.com Tôi sẽ không đồng ý. Đầu tiên, câu hỏi là về việc thêm thuộc tính, không phải là khả năng sử dụng các phương thức khác. Và thứ hai, việc tạo ra helper trong trường hợp này dễ đọc hơn sau đó kiểm tra tình trạng được kích hoạt và sau đó gọi quá tải phương thức chính xác từ xem – archil

2

Giải pháp bằng tác phẩm vòm. Tuy nhiên, đối với những gì bạn đang cố gắng để viết một phần mở rộng là một overkill.

Chỉ cần viết một cái gì đó theo quan điểm của bạn như:

@Html.DropDownListFor(m => m.Id, Model.Values, new { disabled = "disabled" }) 
+0

Vâng, nó hoạt động nhưng phức tạp hơn một chút vì nó không phải lúc nào cũng bị vô hiệu hóa tùy thuộc vào thuộc tính. Tôi không chắc làm thế nào bạn sẽ viết nó như bạn có ở trên cho không có thuộc tính nếu được kích hoạt bằng true nhưng bị vô hiệu hóa = "vô hiệu hóa" cho phép bằng false – AnonyMouse

+2

Vâng, các thông số kỹ thuật html cho thuộc tính vô hiệu hóa (giống như cho chỉ đọc) là một thảm họa. Về mặt pháp lý, họ chỉ có thể lấy tên của thuộc tính. Tuy nhiên, hầu hết các trình duyệt được dạy để chấp nhận bất kỳ điều gì cho các thuộc tính này, đó là lý do tại sao bị vô hiệu hóa = "false" cũng sẽ dẫn đến bạn trong một thuộc tính bị vô hiệu hóa. Bạn có thể bọc toàn bộ DropDownListFor trong câu lệnh if với thuộc tính của bạn kiểm tra dưới dạng điều kiện. Tuy nhiên, tôi thấy làm thế nào nó sẽ là một chút của một mã ít hơn với phần mở rộng. – Dmitry

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