asp.net mvc - How to get the column titles from the Display(Name=) DataAnnotation for a strongly typed list scaffold view at runtime? -


how [display(name="some title")] dataannotations "some title" rendered in list scaffold view's output?

i create typed list scaffold view class:

public class companyholiday {     [key]     public int id { get; set; }      [required]     [display(name = "datum")]     [datatype(system.componentmodel.dataannotations.datatype.date)]     public datetime date { get; set; }      [required]     [stringlength(50)]     [display(name = "feiertag name")]     public string name { get; set; } } 

the view looks this:

@model ienumerable<zeiterfassung.domain.companyholiday>  @{     viewbag.title = "year"; }  <h2>year</h2>  <p>     @html.actionlink("create new", "create") </p> <table> <tr>     <th></th>     <th>         date     </th>     <th>         name     </th> </tr>  @foreach (var item in model) { <tr>     <td>         @html.actionlink("edit", "edit", new { id=item.id }) |         @html.actionlink("details", "details", new { id=item.id }) |         @html.actionlink("delete", "delete", new { id=item.id })     </td>     <td>         @string.format("{0:g}", item.date)     </td>     <td>         @item.name     </td> </tr> }  </table> 

however, don't want "date" , "name" in table header. want "datum" , "feiertag name" rendered there dynamically.

the actual column header titles should come display dataannotation.

how do this?

bit of old topic, came extension method handle this.

lets model is:

public class mymodel {     [display(name = "some property")]     public string someprop { get; set; } } 

drop method static class:

namespace web.extensions {     public static class htmlhelperextensions     {         public static mvchtmlstring displaynamefor<tmodel, tproperty>(this htmlhelper<ienumerable<tmodel>> helper, expression<func<tmodel, tproperty>> expression)         {             var name = expressionhelper.getexpressiontext(expression);             name = helper.viewcontext.viewdata.templateinfo.getfullhtmlfieldname(name);             var metadata = modelmetadataproviders.current.getmetadataforproperty(() => activator.createinstance<tmodel>(), typeof(tmodel), name);             return new mvchtmlstring(metadata.displayname);         }     }  } 

then in view, taking ienumerable<mymodel>, can use this:

@using web.extensions @model ienumerable<mymodel>  <table>     <tr>         <th>             @html.displaynamefor(m => m.avgeleccost)         </th> 

the generated html be:

        <th>             property         </th> 

hope helps!


Comments

Popular posts from this blog

python - Scipy curvefit RuntimeError:Optimal parameters not found: Number of calls to function has reached maxfev = 1000 -

c# - How to add a new treeview at the selected node? -

java - netbeans "Please wait - classpath scanning in progress..." -