2013-04-05 27 views
5

Có thể tiêm một lớp css vào một phần tử HTML đã được đóng gói trong một số MvcHtmlString không?Làm thế nào để tiêm một lớp css vào một MvcHtmlString?

Tôi đã được giao nhiệm vụ, như một phần của khuôn khổ Tôi đang xây dựng, với việc tạo ra phiên bản riêng của tôi về phương pháp khuyến nông MVC cho các yếu tố hình thức (TextBox, TextBoxFor<>, vv), với sự chú ý sau đây:

  • rằng họ phải tạo đánh dấu HTML chính xác, bao gồm các lớp CSS, để khớp với các kiểu đã được thiết kế cho trang web. Trong phần lớn các trường hợp, điều này đơn giản có nghĩa là bổ sung một lớp cụ thể.
  • rằng họ phải càng đúng với phương pháp khuyến nông MVC càng tốt để các nhà phát triển cảm thấy thoải mái sử dụng chúng

Hầu hết, nếu không phải tất cả, các phần mở rộng MVC phương pháp trả về một MvcHtmlString vì vậy cách đơn giản nhất để bắt chước chức năng là gọi những phương thức đó trực tiếp từ các phương thức của tôi. Tôi có riêng tôi Html Helper, OuHelper, rằng khuôn khổ của tôi đang sử dụng, vì vậy các nhà phát triển có nhu cầu để tạo ra, ví dụ, một TextBox, sẽ gọi một cái gì đó dọc theo dòng:

`@ Ou.TextBoxFor (m => m.Username)

Và tôi muốn kết quả Html để render như vậy:

<input type="text" name="Username" id="Username" class="int-text" />

Nếu tôi tạo các phiên bản quá tải của riêng mình vì chúng nằm trong khung MVC, tôi sẽ có thể kiểm soát việc thêm các lớp CSS bổ sung nếu cần nhưng điều đó có vẻ quá mức cần thiết cho việc thay đổi đầu ra HTML nhỏ như vậy. Tôi sẽ cần phải cung cấp việc triển khai tương đương tất cả các tình trạng quá tải (chỉ riêng đối với TextBox có khoảng 12 khi bạn đếm các phiên bản chung và không chung chung). Những gì tôi muốn làm là TagBuilder ngược lại (bắt đầu với đầu ra và tạo ra một đối tượng từ nó mà sẽ cho phép những thứ như MergeAttributes có sẵn) nhưng tôi không nghĩ rằng đó là có thể.

Để rõ ràng: mã khung mà tôi đang viết cần thêm các lớp css, nhưng các nhà phát triển có thể sử dụng các phương pháp mở rộng mà tôi tạo để thêm các lớp css tùy chỉnh của riêng họ. Những sẽ được thêm vào/nối theo chức năng của MVC phương pháp khuyến nông dạng khung tiêu chuẩn

Trả lời

3

Bạn dường như có một hệ thống khá tốt hiện nay. Bạn không thể tiêm/ghi đè các kiểu mặc định cho các lớp HtmlHelper, bạn có thể kiểm tra nguồn cho HtmlHelper's input extensions here nếu bạn muốn.

Cách duy nhất khác mà tôi có thể nghĩ là thực hiện nó sẽ sử dụng các phương thức mở rộng giống như cách thức thực hiện trong nguồn ASP.NET thực tế. Đây là một ví dụ, tên của hàm có thể là bất cứ điều gì bạn muốn nhưng nó cần phải khác với TextBoxFor vì nó có cùng danh sách tham số.

public static class HtmlHelperExtensions 
{ 
    public static MvcHtmlString IntTextFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression) 
    { 
     return htmlHelper.TextBoxFor(expression, new { @class = "int-text" }); 
    } 
} 

Việc sử dụng sẽ giống như MVC thông thường chỉ bao gồm không gian tên của (các) phương pháp tiện ích mở rộng của bạn.

@using MyProject.Helpers; 

@Html.IntTextFor(e => e.Age) 
+0

Chúc mừng Daniel - vâng, có vẻ như tôi sẽ làm điều gì đó dọc theo những dòng này. Đã hy vọng tránh phải tạo ra quá nhiều tình trạng quá tải nhưng tôi cần cung cấp cùng một mức độ linh hoạt như khung MVC hiện đang cung cấp. Tôi sẽ tạo một số phương thức mở rộng và hợp nhất lớp vào các thuộc tính html theo yêu cầu (để các nhà phát triển sử dụng framework của tôi cũng có thể thêm các lớp tùy chỉnh của riêng họ nếu họ cần) – levelnis

0

bạn có thể làm như thế này

@Ou.TextBoxFor(m => m.Username,new{@Class="your class Name"}) 

hoặc cho phong cách inline

@Ou.TextBoxFor(m => m.Username,new{@style="font-size:10px"}) 
Các vấn đề liên quan