在我们的asp.net mvc表单中,我们通常会向视图模型属性添加属性,例如DisplayName,Description和Required。
然后我们只需为每个属性调用Html.EditorFor(model => model.PropertyName)
。
我现在有一种情况,我没有强类型的viewmodel,我可以应用这些属性。相反,我有一个以下类的列表:
public class AttributeValue
{
public string Name { get; set; }
public string Description { get; set; }
public bool Required { get;set; }
public object AttributeValue { get; set; }
}
如何使用上述类中存储的信息手动添加元数据,以便EditorFor
帮助程序和验证仍然有效?
答案 0 :(得分:4)
您应该编写自定义ModelMetadataProvider和ModelValidatorProvider类
public class DynamicModelValidatorProvider : ModelValidatorProvider
{
public override IEnumerable<ModelValidator> GetValidators(ModelMetadata metadata, ControllerContext context)
{
// you validation logic go there
yield break;
}
}
public class DynamicModelMetadataProvider : ModelMetadataProvider
{
public override IEnumerable<ModelMetadata> GetMetadataForProperties(object container, Type containerType)
{
yield return new ModelMetadata(this, containerType, null, typeof (string), "Hello");
yield return new ModelMetadata(this, containerType, null, typeof (string), "World");
}
public override ModelMetadata GetMetadataForProperty(Func<object> modelAccessor, Type containerType, string propertyName)
{
return GetMetadataForProperties(null, containerType).SingleOrDefault(x => x.PropertyName == propertyName);
}
public override ModelMetadata GetMetadataForType(Func<object> modelAccessor, Type modelType)
{
return new ModelMetadata(this, null, modelAccessor, modelType, null);
}
}
答案 1 :(得分:0)
我认为你在编写自定义对象模板方面要好得多。
请查看Brad Wilson关于如何在ASP.NET MVC中使用模板的系列文章,您可以在这里找到:
http://bradwilson.typepad.com/blog/2009/10/aspnet-mvc-2-templates-part-1-introduction.html
从那里,您将找到显示和编辑的默认对象模板。
您需要修改模板,以便从模型中获取元素,而不是从元数据中获取值。