Vấn đề là, mẫu của bạn có thể chứa một số phần tử HTML, vì vậy MVC sẽ không biết phải cái nào để áp dụng kích thước của bạn/lớp. Bạn sẽ phải tự định nghĩa nó.
Hãy mẫu của bạn bắt nguồn từ lớp học của bạn riêng gọi là TextBoxViewModel:
public class TextBoxViewModel
{
public string Value { get; set; }
IDictionary<string, object> moreAttributes;
public TextBoxViewModel(string value, IDictionary<string, object> moreAttributes)
{
// set class properties here
}
public string GetAttributesString()
{
return string.Join(" ", moreAttributes.Select(x => x.Key + "='" + x.Value + "'").ToArray()); // don't forget to encode
}
}
Trong mẫu bạn có thể làm điều này:
<input value="<%= Model.Value %>" <%= Model.GetAttributesString() %> />
Theo quan điểm của bạn, bạn cần làm:
<%= Html.EditorFor(x => x.StringValue) %>
or
<%= Html.EditorFor(x => new TextBoxViewModel(x.StringValue, new IDictionary<string, object> { {'class', 'myclass'}, {'size', 15}}) %>
Biểu mẫu đầu tiên sẽ hiển thị mẫu mặc định cho chuỗi. Biểu mẫu thứ hai sẽ hiển thị mẫu tùy chỉnh.
Alternative sử dụng cú pháp thông thạo giao diện:
public class TextBoxViewModel
{
public string Value { get; set; }
IDictionary<string, object> moreAttributes;
public TextBoxViewModel(string value, IDictionary<string, object> moreAttributes)
{
// set class properties here
moreAttributes = new Dictionary<string, object>();
}
public TextBoxViewModel Attr(string name, object value)
{
moreAttributes[name] = value;
return this;
}
}
// and in the view
<%= Html.EditorFor(x => new TextBoxViewModel(x.StringValue).Attr("class", "myclass").Attr("size", 15) %>
ý rằng thay vì làm điều này trong giao diện, bạn cũng có thể làm điều này trong điều khiển, hoặc tốt hơn nhiều trong ViewModel:
public ActionResult Action()
{
// now you can Html.EditorFor(x => x.StringValue) and it will pick attributes
return View(new { StringValue = new TextBoxViewModel(x.StringValue).Attr("class", "myclass").Attr("size", 15) });
}
Cũng lưu ý rằng bạn có thể tạo lớp TemplateViewModel cơ sở - một nền tảng chung cho tất cả các mẫu xem của bạn - sẽ chứa các hỗ trợ cơ bản cho các thuộc tính/v.v.
Nhưng nói chung tôi nghĩ MVC v2 cần một giải pháp tốt hơn. Nó vẫn còn Beta - hãy yêu cầu nó ;-)
Ý tưởng đưa các thuộc tính định dạng HTML vào mô hình (xem) là chống lại ý tưởng của MVC để tách biệt chế độ xem và logic! Điều gì xảy ra nếu mô hình sẽ cần các biểu diễn khác nhau trong HTML? – saintedlama
@Saintedlama: Bạn nên đặt chú thích dữ liệu trên * viewmodel *, vì mục đích duy nhất của viewmodel là cung cấp mô hình dữ liệu có cấu trúc cho chế độ xem *. Không được nhầm lẫn với * model *, trong thuật ngữ MVC thường đại diện cho một thực thể DB, mà không nên có bất kỳ thuộc tính liên quan đến khung nhìn nào. Có nói rằng, nó là không may rằng chú thích viewmodel của mình bắt đầu với HTMLxxx bởi vì điều đó ngụ ý HTML như là một lớp trình bày, nhưng một dòng đã được rút ra ở đâu đó. :) Bên cạnh đó, nếu anh ta sử dụng lại viewmodel để nói ứng dụng Silverlight, anh ta có thể dễ dàng thêm các thuộc tính SL vào viewmodel của mình. –