2012-04-18 28 views
8

Tôi đang cố gắng để tự động thiết lập các thuộc tính disabled cho TextBoxFor HtmlHelperđộng thiết lập các thuộc tính html tàn tật cho TextBoxFor HtmlHelper

@Html.TextBoxFor(model => model.Street, 
       new 
       { 
        @class = "", 
        disabled = (Model.StageID==(int)MyEnum.Sth) ? "disabled" : "" 
       }) 

nhưng thậm chí nếu có disabled="" nó cũng giống như disabled="disabled". Làm thế nào để có được xung quanh này?

Trả lời

19

Tôi có cùng một vấn đề về tháng trước đây và tôi đã hoàn thành bằng cách sử dụng phương pháp mở rộng này cho nó

public static class AttributesExtensions 
{ 
    public static RouteValueDictionary DisabledIf(
     this object htmlAttributes, 
     bool disabled 
    ) 
    { 
     var attributes = new RouteValueDictionary(htmlAttributes); 
     if (disabled) 
     { 
      attributes["disabled"] = "disabled"; 
     } 
     return attributes; 
    } 
} 

Và sau đó bạn có thể sử dụng nó như thế này

@Html.TextBoxFor(
    model => model.Street, 
    new { @class = "" }.DisabledIf(Model.StageID==(int)MyEnum.Sth) 
) 

EDIT (sau Paul 's comment):

Việc sử dụng data-xxx thuộc tính html có thể được khai thác bằng cách sử dụng hàm tạo của lớp System.Web.Routing.RouteValueDictionary, vì dấu gạch dưới sẽ không được tự động chuyển thành dấu trừ.

Sử dụng phương pháp System.Web.Mvc.HtmlHelper.AnonymousObjectToHtmlAttributes thay thế: sẽ giải quyết vấn đề này.

CẬP NHẬT MÃ (mở rộng phương pháp duy nhất cơ thể)

var attributes = HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes); 
if (disabled) 
{ 
    attributes["disabled"] = "disabled"; 
} 
return attributes; 
+0

hoạt động, tôi nợ Bạn bia! Cảm ơn – Tony

+0

Tôi sẽ chờ đợi nó xD –

+0

đó là khá táo bạo:> nhưng tôi thích nó. Tuy nhiên, tôi đang thêm một biến thể (dễ vỡ hơn) của riêng mình – goofballLogic

0

Sử dụng phương pháp mở rộng dưới đây tạo ra kết quả tương tự, nhưng điều này có lẽ là mong manh hơn:

@Html.TextBoxFor(
    model => model.Street, 
    new { @class = "form-control" } 
).DisabledIf(Model.IsReadOnly) 

Extension:

using System.Text.RegularExpressions; 
using System.Web.Mvc; 

namespace xxx.HtmlHelpers 
{ 
    public static class MvcHtmlStringExtensions 
    { 

     private static readonly Regex OpeningTagPattern; 

     static MvcHtmlStringExtensions() 
     { 
      OpeningTagPattern = new Regex("<[a-zA-Z]*"); 
     } 

     public static MvcHtmlString DisabledIf(this MvcHtmlString controlHtml, bool isDisabled) 
     { 
      if (!isDisabled) return controlHtml; 
      return 
       new MvcHtmlString(OpeningTagPattern.Replace(controlHtml.ToString(), 
        x => string.Format("{0} disabled=\"disabled\"", x.Groups[0]))); 
     } 

    } 
} 
+0

Tôi đang chuyển đổi mã của tôi để sử dụng phiên bản Chuck Norris ở trên :) – goofballLogic

0

Có lẽ Id giai đoạn của bạn không nhận được t

@{ 
    if(Model.StageID != null && Model.StageID > 0) 
    { 
     @Html.TextBoxFor(model => model.Street, 
      new 
      { 
       @class = "", 
       disabled = (Model.StageID==(int)MyEnum.Sth) ? "disabled" : "" 
      }) 
    }else{ 

     @Html.TextBoxFor(model => model.Street, 
      new 
      { 
       @class = "" 
      }) 
    } 
} 
0

Chúng tôi thực sự chỉ gặp vấn đề tương tự. Chúng tôi đã kết thúc việc triển khai một phương thức mở rộng với các tham số quá tải, trong đó có một boolean cho biết chúng ta có muốn điều khiển bị vô hiệu hóa hay không. Chúng tôi chỉ thêm thuộc tính "đã tắt" khi thích hợp và để HtmlHelper cài sẵn xử lý việc nâng hạng nặng.

lớp mở rộng và phương pháp:

using System; 
using System.Collections.Generic; 
using System.Linq.Expressions; 
using System.Web.Mvc; 
using System.Web.Mvc.Html; 
using System.Web.Routing; 
public static class OurHtmlHelpers 
{ 
    public const string DisabledAttribute = "disabled"; 

    public static MvcHtmlString TextBoxFor<TModel, TProp>(this HtmlHelper<TModel> htmlHelper, 
                  Expression<Func<TModel, TProp>> expression, 
                  object htmlAttributes, 
                  bool canEdit) 
    { 
     var htmlAttributeDictionary = SetDisabledAttribute(htmlAttributes, canEdit); 

     return htmlHelper.TextBoxFor(expression, htmlAttributeDictionary); 
    }   

    private static RouteValueDictionary SetDisabledAttribute(object htmlAttributes, bool canEdit) 
    { 
     var htmlAttributeDictionary = new RouteValueDictionary(htmlAttributes); 

     if (!canEdit) 
     { 
      htmlAttributeDictionary.Add(DisabledAttribute, DisabledAttribute); 
     } 

     return htmlAttributeDictionary; 
    } 
} 

Sau đó, bạn chỉ cần tham khảo lớp mới của bạn và gọi @Html.TextBoxFor(m => m.SomeValue, new { @class = "someClass" }, <Your bool value>)

Nó đáng chú ý là bạn phải xác định các phần mở rộng cho bất kỳ quá tải TextBoxFor bạn muốn sử dụng, nhưng nó có vẻ như một thương mại hợp lý. Bạn cũng có thể sử dụng hầu hết cùng một mã cho các HtmlHelpers khác mà bạn muốn thêm chức năng vào.

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