我正在使用 Asp.Net MVC 2,并尝试遍历元数据以将输入控件添加到网格列。大多数属性(如 DisplayAttribute、StringLength 属性等)不会由默认模型元数据提供程序填充。
1-我认为这些属性将在 MVC3 中得到支持,对吧?
2- 在 MVC3 推出之前,我是否可以使用自定义提供程序,我记得看到一个自定义元数据提供程序(以为它在 MVCContrib 中)但在那里找不到,有人知道在哪里可以找到支持此属性的元数据提供程序吗?
我正在使用 Asp.Net MVC 2,并尝试遍历元数据以将输入控件添加到网格列。大多数属性(如 DisplayAttribute、StringLength 属性等)不会由默认模型元数据提供程序填充。
1-我认为这些属性将在 MVC3 中得到支持,对吧?
2- 在 MVC3 推出之前,我是否可以使用自定义提供程序,我记得看到一个自定义元数据提供程序(以为它在 MVCContrib 中)但在那里找不到,有人知道在哪里可以找到支持此属性的元数据提供程序吗?
我编写了一个提供程序来处理比标准提供程序更多的属性。这是想法:
/// <summary>
/// Adds support for data annotation attributes omitted from DataAnnotationsModelMetadataProvider
/// </summary>
public class ExtendedDataAnnotationsModelMetadataProvider : DataAnnotationsModelMetadataProvider
{
protected override ModelMetadata CreateMetadata(IEnumerable<Attribute> attributes, Type containerType, Func<object> modelAccessor, Type modelType, string propertyName)
{
var result = base.CreateMetadata(attributes, containerType, modelAccessor, modelType, propertyName);
DisplayAttribute da = attributes.OfType<DisplayAttribute>().FirstOrDefault();
if (da != null)
{
var autoGenerate = da.GetAutoGenerateFilter();
if (autoGenerate.HasValue)
{
result.AdditionalValues[AdditionalValuesKeys.AutoGenerateFilter] = autoGenerate.Value;
}
var groupName = da.GroupName;
if (!string.IsNullOrEmpty(groupName))
{
result.AdditionalValues[AdditionalValuesKeys.GroupName] = groupName;
}
if (!string.IsNullOrEmpty(da.Prompt))
{
result.Watermark = da.Prompt;
}
}
DisplayColumnAttribute dc = attributes.OfType<DisplayColumnAttribute>().FirstOrDefault();
if (dc != null)
{
var sc = dc.SortColumn;
if (!string.IsNullOrEmpty(sc))
{
result.AdditionalValues[AdditionalValuesKeys.SortColumnName] = sc;
if (dc.SortDescending)
{
result.AdditionalValues[AdditionalValuesKeys.SortDescending] = true;
}
}
}
StringLengthAttribute sla = attributes.OfType<StringLengthAttribute>().FirstOrDefault();
if (sla != null)
{
result.AdditionalValues[AdditionalValuesKeys.MaximumStringLength] = sla.MaximumLength;
}
return result;
}
}
自然,带有 MVC 的默认模板实际上并没有对这些信息做任何事情。您必须自己定制它们。