Model Display Name Using Reflection

I am working on a project where I need to display several hundred properties. To save a lot of tedious layout, I decided to use reflection.

//markup removed to keep this concise
@for (var i = 0; i < Model.SiteAndJobDetails.GetType().GetProperties().Count(); i++)
{
  @Model.SiteAndJobDetails.GetType().GetProperties()[i].Name
  @Model.SiteAndJobDetails.GetType().GetProperties()[i].GetValue(Model.SiteAndJobDetails, null)
}

Although it’s slower to render, it saves me from writing about two hundred properties and values ​​using HTML helpers. At least that was the plan. However, I need to use @Html.DisplayNameForor something similar to get the attribute value Displayfrom the property.

My thoughts were

@Html.DisplayNameFor(m=>@Model.SiteAndJobDetails.GetType().GetProperties()[i].Name)

But this will not work, I would think, because I use reflection here to get the name of the property. Is there another way?

+1
source share
3

@Andrei , ViewData.ModelMetadata, .

@ViewData.ModelMetadata.Properties.First(x => x.PropertyName == "SiteAndJobDetails")
.Properties.SingleOrDefault(x => x.PropertyName == Model.SiteAndJobDetails.GetType().GetProperties()[i].Name)
.DisplayName

- , ,

@if (!string.IsNullOrEmpty(@ViewData.ModelMetadata.Properties.First(x => x.PropertyName == "SiteAndJobDetails").Properties.SingleOrDefault(x => x.PropertyName == Model.SiteAndJobDetails.GetType().GetProperties()[i].Name).DisplayName))
{
    @ViewData.ModelMetadata.Properties.First(x => x.PropertyName == "SiteAndJobDetails").Properties.SingleOrDefault(x => x.PropertyName == Model.SiteAndJobDetails.GetType().GetProperties()[i].Name).DisplayName
}
else
{
    @Model.SiteAndJobDetails.GetType().GetProperties()[i].Name
}
+1

( ):

string displayName = ViewData.ModelMetadata.Properties
      .Where(x => x.PropertyName == Model.SiteAndJobDetails.GetType()
                                   .GetProperties()[i].Name)
      .SingleOrDefault()
      .DisplayName;
+1

:

@functions {
string R<TCLASS>(Expression<Func<TCLASS, Object>> expression) //Lambda = x => x.TPROPERTY
{
    var memberExpression = expression.Body as MemberExpression;
    if(memberExpression == null)
    {
        memberExpression = (MemberExpression) ((UnaryExpression)expression.Body).Operand;
    }

    return memberExpression.Member.Name;
}
}

:

@(R<ModelClassName>(x => x.PropertyName)) //Outputs "PropertyName"

JavaScript, JSON. :

<script>
    function recieveJsonResult(classNameDto) {
        var classProperty = classNameDto.@(R<ClassNameDto>(x => x.PropertyName));
    }
</script>

, , , .

0
source

Source: https://habr.com/ru/post/1676698/


All Articles