MVC3 模型中的自定义 HTML 属性
本文关键字:HTML 属性 自定义 模型 MVC3 | 更新日期: 2023-09-27 18:30:37
我想创建一个模型:
public class TestModel
{
Microdata(Data = "data-test=this is a test!")]
public bool Test { get; set; }
}
然后在视图中:
@Html.DisplayForModel()
我正在寻找的结果是这样的:
<label>Test:</label> <input type="checkbox" data-test="this is a test!" />
我已经创建了一个自定义属性类,但这没有产生任何结果。
[AttributeUsage(AttributeTargets.Property | AttributeTargets.Class, AllowMultiple = false, Inherited = true)]
public class MicrodataAttribute : Attribute
{
public string Data { get; set; }
public RouteValueDictionary GetAttributes()
{
var attributes = new RouteValueDictionary();
if (this.Data != null)
{
string[] kv = this.Data.Split(',');
attributes.Add(kv[0], kv[1]);
}
return attributes;
}
}
public class MetadataProvider : DataAnnotationsModelMetadataProvider
{
protected override ModelMetadata CreateMetadata(IEnumerable<Attribute> attributes, Type containerType, Func<object> modelAccessor, Type modelType, string propertyName)
{
var metadata = base.CreateMetadata(attributes, containerType, modelAccessor, modelType, propertyName);
var additionalValues = attributes.OfType<HtmlPropertiesAttribute>().FirstOrDefault();
if (additionalValues != null)
{
metadata.AdditionalValues.Add("HtmlAttributes", additionalValues);
}
return metadata;
}
}
为什么会这样?没有使用您的属性的代码...
阅读下面的博客文章 - 它描述了 MVC 如何使用元数据,并提供了一个您需要编写的自定义object
模板的示例:
http://bradwilson.typepad.com/blog/2009/10/aspnet-mvc-2-templates-part-1-introduction.html
在与@JakubKonecki讨论这个问题并阅读他介绍的博客文章之后。这是我的 EditTemplate,用于帮助在 MVC 2/3 和很可能 4 中创建数据破折号属性。
我将这个文件保存在root/Views/Shared/EditTemplates下作为String.cshtml.cshtml。 cshtml,因为我使用的是Razor引擎。如果您使用的是Area,则位置可能会有所不同,并且它们不必存储在"共享"视图文件夹中。只需阅读全文博客@JakubKonecki由Brad Wilson发布。
再次感谢@JakubKonecki!
@{
Dictionary<string, object> AV = ViewData.ModelMetadata.AdditionalValues;
Dictionary<string, object> htmlAttr = new Dictionary<string,object>();
foreach (KeyValuePair<string, object> A in AV)
{
if (A.Value is System.Web.Routing.RouteValueDictionary)
{
foreach (KeyValuePair<string, object> B in (System.Web.Routing.RouteValueDictionary)A.Value)
{
htmlAttr.Add(B.Key, B.Value);
}
}
}
htmlAttr.Add("class", "text-box single-line");
htmlAttr.Add("type", "text");
}
@Html.TextBox("", ViewData.TemplateInfo.FormattedModelValue, htmlAttr)