2012-01-31 8 views
26

Tôi có ứng dụng web C# .Net. Trong ứng dụng đó, tôi cần phải vô hiệu hóa các điều khiển Html.TextBoxFor điều kiện (cũng là các điều khiển Html.DropDownListFor) dựa trên người đã đăng nhập vào hệ thống. Tôi đã cố gắng sử dụngMVC3 Điều kiện vô hiệu hóa Html.TextBoxFor()

@Html.TextBoxFor(model => model.ProposalName, new { @ViewBag.IsDisabled }) 

đâu @ViewBag.IsDisabled được thiết lập để một trong hai String.Empty hoặc "tàn tật" trong Controller. Tuy nhiên, điều này hiển thị là IsDisabled='disabled' hoặc IsDisabled="" để kiểm soát không bị tắt. Khi tôi đã thử

@Html.TextBoxFor(model => model.ProposalName, new { @ViewBag.Disabled }) 

Kiểm soát luôn bị tắt ngay cả khi ViewBag.Disabled không chứa văn bản. Làm thế nào tôi có thể vô hiệu hóa các điều khiển Html.TextBoxFor() điều kiện?

Trả lời

51

Hãy thử

@Html.TextBoxFor(model => model.ProposalName, ViewBag.Disabled ? (object)new { disabled="disabled" } : new {}) 
+0

@epig .... thú vị. giá trị của ViewBag.Disabled sẽ là bao nhiêu? – MikeTWebb

+1

@MikeTWebb ViewBag.Disabled phải là giá trị boolean. – epignosisx

+0

@epig .... đúng hay sai là các giá trị. Hoạt động tuyệt vời! Cảm ơn – MikeTWebb

19

Giải pháp đăng bởi @epignosisx hoạt động, nhưng nó có thể là một vấn đề nếu bạn muốn thêm một số thuộc tính khác bởi vì bạn sẽ phải thêm nó nó cả hai đối tượng (một với disabled và cái bây giờ trống rỗng của nó).

Thậm chí tệ hơn nếu bạn có một số thuộc tính bool khác vì bạn sẽ có bốn đối tượng khác nhau, mỗi đối tượng cho mỗi kết hợp.

Giải pháp tốt nhất ở đây (có thêm một chút mã) là xây dựng một phương pháp mở rộng cho HtmlHelper để nhận thuộc tính boolean của bạn làm tham số.

public static MvcHtmlString TextBoxDisabledFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, bool disabled, object htmlAttributes = null) 
{ 
    return TextBoxDisabledFor(htmlHelper, expression, disabled, HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes)); 
} 

public static MvcHtmlString TextBoxDisabledFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, bool disabled, IDictionary<string, object> htmlAttributes) 
{ 
    if (htmlAttributes == null) 
     htmlAttributes = new Dictionary<string, object>(); 
    if (disabled) 
     htmlAttributes["disabled"] = "disabled"; 
    return htmlHelper.TextBoxFor(expression, htmlAttributes); 
} 

Here there is another example

8

Tôi có vấn đề này cùng và quyết định viết phương pháp HtmlHelper phần mở rộng của riêng tôi.

public static MvcHtmlString Disable(this MvcHtmlString helper, bool disabled) 
    { 
     if (helper == null) 
      throw new ArgumentNullException(); 

     if (disabled) 
     { 
      string html = helper.ToString(); 
      int startIndex = html.IndexOf('>'); 

      html = html.Insert(startIndex, " disabled=\"disabled\""); 
      return MvcHtmlString.Create(html); 
     } 

     return helper; 
    } 

Điều này sẽ chấp nhận boolean để cho biết liệu điều khiển có bị vô hiệu hay không. Nó chỉ gắn thêm disabled="disabled" ngay bên trong > đầu tiên nó xuất hiện trong một chuỗi.

Bạn có thể sử dụng nó như dưới đây.

@Html.TextBoxFor(model => model.ProposalName).Disable(true)

+0

rất mát mẻ ...... – Bohn

5

Dưới đây là phương pháp tôi sử dụng, mà không yêu cầu phần mở rộng, và không giới hạn bạn chỉ có một thuộc tính HTML. Nó giả định có một tài sản boolean có tên là "Disabled" trong mô hình của bạn, nhưng bạn có thể đặt bất cứ điều gì bạn muốn trong đó, miễn là nó đánh giá để boolean cho các nhà điều hành ternary:

@Html.TextBoxFor(model => model.Whatever, 
    new Dictionary<string, object>() { 
    { "size", "5" }, 
    { "class", "someclasshere" }, 
    { model.Disabled ? "disabled" : "data-notdisabled", "disabled" } 
    }) 

Hạn chế với các phím tắt chuẩn ký hiệu là tên của thuộc tính không thể động. Bằng cách tạo một từ điển đúng loại, bạn có thể đặt tên thuộc tính động, sau đó bạn chuyển từ điển đó vào hộp văn bản làm từ điển của các thuộc tính. Khi trường không được vô hiệu hóa, nó sẽ chuyển một thuộc tính có tên "data-notdisabled" thay vì một tên "disabled", mà trình duyệt sẽ bỏ qua.

2

Mở rộng @ câu trả lời của James, tôi đã viết phần mở rộng HtmlHelper này mà cập nhật/gỡ bỏ thuộc tính disabled nếu nó đã hiện diện, hoặc thêm nó nếu không muốn nói:

public static MvcHtmlString Disable(this MvcHtmlString helper, bool disabled) { 
    string html = helper.ToString(); 
    var regex = new Regex("(disabled(?:=\".*\")?)"); 
    if (regex.IsMatch(html)) { 
     html = regex.Replace(html, disabled ? "disabled=\"disabled\"" : "", 1); 
    } else { 
     regex = new Regex(@"(\/?>)"); 
     html = regex.Replace(html, disabled ? "disabled=\"disabled\"$1" : "$1", 1); 
    } 
    return MvcHtmlString.Create(html); 
} 

Nó cũng đóng độc đáo với thẻ tự đóng (như <input />).

Cách sử dụng là như nhau:

@Html.TextBoxFor(model => model.PropertyName).Disable(true) 

Thử nghiệm trên cả @Html.DropDownListFor()@Html.TextBoxFor().