问题是,您的模板可以包含多个 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 需要更好的解决方案。它仍然是 Beta - 去问问吧 ;-)