asp.net mvc添加没有属性的模型元数据

时间:2011-08-11 22:01:14

标签: asp.net-mvc asp.net-mvc-3

在我们的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帮助程序和验证仍然有效?

2 个答案:

答案 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

从那里,您将找到显示和编辑的默认对象模板。

您需要修改模板,以便从模型中获取元素,而不是从元数据中获取值。