ปัญหาคือเทมเพลตของคุณสามารถมีองค์ประกอบ HTML ได้หลายรายการดังนั้น MVC จะไม่รู้ว่าควรใช้ขนาด / คลาสของคุณ คุณจะต้องกำหนดเอง
สร้างเทมเพลตของคุณมาจากคลาสของคุณเองที่เรียกว่า 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
}
}
ในเทมเพลตคุณสามารถทำได้:
<input value="<%= Model.Value %>" <%= Model.GetAttributesString() %> />
ในมุมมองของคุณคุณทำ:
<%= Html.EditorFor(x => x.StringValue) %>
or
<%= Html.EditorFor(x => new TextBoxViewModel(x.StringValue, new IDictionary<string, object> { {'class', 'myclass'}, {'size', 15}}) %>
รูปแบบแรกจะแสดงเทมเพลตเริ่มต้นสำหรับสตริง แบบฟอร์มที่สองจะแสดงเทมเพลตแบบกำหนดเอง
ไวยากรณ์ทางเลือกใช้อินเทอร์เฟซที่คล่องแคล่ว:
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) %>
สังเกตว่าแทนที่จะทำสิ่งนี้ในมุมมองคุณสามารถทำได้ในคอนโทรลเลอร์หรือดีกว่ามากใน 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) });
}
โปรดสังเกตด้วยว่าคุณสามารถสร้างคลาส TemplateViewModel พื้นฐานซึ่งเป็นพื้นฐานทั่วไปสำหรับเทมเพลตมุมมองทั้งหมดของคุณซึ่งจะมีการรองรับพื้นฐานสำหรับแอตทริบิวต์ / ฯลฯ
แต่โดยทั่วไปฉันคิดว่า MVC v2 ต้องการโซลูชันที่ดีกว่า ยังเป็นเบต้าอยู่ - ไปขอเลย ;-)