Read DataAnnotations from a collection of models in an MCV2 view

纵饮孤独 提交于 2019-12-22 06:56:57

问题


In my MVC2 AdminArea I'd like to create an overview table for each of my domain models. I am using DataAnnotations like the following for the properties of those domain model objects:

[DisplayName("MyPropertyName")]
public string Name { get; set; }

Now my question is: How can I access the DisplayName Attribute if my view receives a collection of my domain models? I need this to build the table headers which are defined outside of the usual

<% foreach (var item in Model) { %>

loop. Inside this loop I can write

<%: Html.LabelFor(c => item.Name) %>

but is there any way to access this information using the collection of items instead of a concrete instance?

Thanks in advance!


回答1:


There is a ModelMetaData class that has a static method called FromLambdaExpression. If you call it and pass in your property, along with your ViewData, it will return an instance of ModelMetaData. That class has a DisplayName property that should give you what you need. You can also get other meta data information from this object.

For example, you can create an empty ViewDataDictionary object to get this information. It can be empty because the ModelMetaData doesn't actually use the instance, it just needs the generic class to define the type being used.

//This would typically be just your view model data.    
ViewDataDictionary<IEnumerable<Person>> data = new ViewDataDictionary<IEnumerable<Person>>();

ModelMetadata result = ModelMetadata.FromLambdaExpression(p => p.First().Name, data);
string displayName = result.DisplayName;

The First() method call doesn't break even if you have no actual Person object because the lambda is simply trying to find the property you want the meta data about. Similarly, you could d this for a single Person object:

//This would typically be just your view model data.    
ViewDataDictionary<Person> data = new ViewDataDictionary<Person>();

ModelMetadata result = ModelMetadata.FromLambdaExpression(p => p.Name, data);

You could clean this up significantly with a helper or extension method, but this should put you on the right path.




回答2:


Alright, I followed sgriffinusa's advise (thanks again!) and created a strongly typed HtmlHelper:

public static MvcHtmlString MetaDisplayName<TModel, TProperty>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TProperty>> expression) where TModel : class
{
    ModelMetadata metadata = ModelMetadata.FromLambdaExpression(expression, helper.ViewData);
    return MvcHtmlString.Create(metadata.GetDisplayName());
}

Of course TModel still is a collection of domain models like stated in my inital question but we can call the helper in the view like this:

<%: Html.MetaDisplayName(p => p.First().Name) %>


来源:https://stackoverflow.com/questions/4479032/read-dataannotations-from-a-collection-of-models-in-an-mcv2-view

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!