正在更新不带属性的DisplayName
本文关键字:属性 DisplayName 更新 | 更新日期: 2023-09-27 18:12:33
我需要在我的模型中使用一个现有的对象作为属性,我不能在文件编译时应用DisplayNameAttribute。
这是一个复杂而深奥的对象,这个模式需要重复——除非万不得已,否则我不想在它上面创建一个包装器。
我认为最合适的方法是手动设置ModelMetadata类上的DisplayName属性。我已经设法找到属性,并使用下面的代码设置显示属性:
var metadata = ModelMetadataProviders.Current.GetMetadataForType(null, model.GetType());
metadata.Properties.Where(x => x.PropertyName == "FirstName").Single().DisplayName = "First name";
对第二行所做的更改不影响"source of truth"——也就是说,每次执行第一行时,FirstName
上的DisplayName
属性被设置为null。
我该如何解决这个问题?
你可以覆盖DataAnnotationsModelMetadataProvider
来设置DisplayName(和做各种其他花哨的东西)。
using System.Web.Mvc;
public class CustomModelMetaDataProvider : DataAnnotationsModelMetadataProvider {
// called once for each property of the ViewModel
protected override ModelMetadata CreateMetadata(IEnumerable<Attribute> attributes, Type containerType, Func<object> modelAccessor, Type modelType, string propertyName) {
Func<IEnumerable<Attribute>, ModelMetadata> metadataFactory = attr => base.CreateMetadata(attr, containerType, modelAccessor, modelType, propertyName);
var metadata = metadataFactory(attributes);
// set DisplayName depending on ViewModel type and property name
if (modelType == typeof(CustomModelToOverride)) {
if (propertyName == "FirstName") {
metadata.DisplayName = "First name";
}
else if (propertyName == "LastName") {
// ...
}
}
return metadata;
}
}
在Global.asax.cs
中注册这个自定义MetaDataProvider
protected void Application_Start() {
// ...
var metaDataProvider = new CustomModelMetaDataProvider();
ModelMetadataProviders.Current = metaDataProvider;
}