2012-12-17 12 views
5

Ho le seguenti linee di rasoio per ora:ASP.NET MVC Razor intestazioni e Vista per ogni colonna in modo dinamico

<table border=1 cellpadding=3 cellspacing=1 rules="rows" frame="box"> 
<tr> 
    <th>Türkçe Söz Dizisi</th> 
    <th>English Word Sequence</th> 
    <th></th> 
</tr> 

@foreach (var item in Model) { 
<tr> 
    <td> 
     @Html.DisplayFor(modelItem => item.Tr) 
    </td> 
    <td> 
     @Html.DisplayFor(modelItem => item.En) 
    </td> 
    <td> 
     @Html.ActionLink((String)@ViewBag.Edit, "Edit", new { id=item.ID }) | 
     @Html.ActionLink((String)@ViewBag.Delete, "Delete", new { id=item.ID }) 
    </td> 
</tr> 
} 

</table> 

Tuttavia, vorrei aggiungere alcune colonne automaticamente dal programma di tabella del database. Ho bisogno di un modo per stampare questo e di conseguenza. In breve, ho bisogno di un modo per esaminare le colonne dinamiche di Model. Come posso raggiungere questo obiettivo?

MODIFICA: Il mio tipo di modello qui è "Proposta". Tuttavia, voglio raggiungere l'attributo dinamico di Proposal.Type.Word (Tr, En o qualsiasi altro Enum di lingua aggiunto). Come posso?

@foreach (var item in Model) { 
    Type objectType = Type.GetType(typeof(RexamOneriSistemi.Models.Word).AssemblyQualifiedName); 
    System.Reflection.PropertyInfo[] fields = objectType.GetProperties(); 

<tr> 
    <td>@Html.DisplayFor(modelItem => item.ID)</td> 
    <td>@Html.DisplayFor(modelItem => item.Owner.Name)</td> 
    @foreach (System.Reflection.PropertyInfo f in fields) { 
    if (f.Name.ToString() == @HttpContext.Current.Session["Language"].ToString()) 
    { 
     <td> 
     // What to do here exactly to get item.Type.Word.[dynamic attribute]? 
     </td> 
    } 
</tr> 
} 

posso ottenere Razor String

string s = "@Html.Displayfor(modelItem => item.Type.Word." + System.Web.HttpContext.Current.Session["Language"] + ")" 

Resulting: @Html.Displayfor(modelItem => item.Type.Word.Tr) 

Posso inserire una stringa per essere reso come Razor sintassi? Se sì, come?

+0

la visualizzazione è fortemente digitata? –

+0

Sì o no, non importa. Posso cambiare in base a qualsiasi risposta operativa alla mia domanda. –

risposta

6

Ho provato questo codice e funziona

<table border=1 cellpadding=3 cellspacing=1 rules="rows" frame="box"> 
    <tr> 
     @{ 
     Type objectType = Type.GetType(typeof(yourProjectNamespace.Models.Language).AssemblyQualifiedName); 


     System.Reflection.PropertyInfo[] fields = objectType.GetProperties(); 

     foreach (System.Reflection.PropertyInfo f in fields) 
     { 

     <th> @f.Name.ToString() </th> 

     } 
    } 

    </tr> 

    @foreach (yourModelType item in Model) { 
    <tr> 
    foreach (System.Reflection.PropertyInfo f in fields) 
     { 

     <td>@Html.Display(f.Name.ToString())</td> 

     } 
     <td> 
      @Html.ActionLink((String)@ViewBag.Edit, "Edit", new { id=item.ID }) | 
      @Html.ActionLink((String)@ViewBag.Delete, "Delete", new { id=item.ID }) 
     </td> 
    </tr> 
    } 
      </table> 

Per ottenere assemply qualificato nome della classe, vedi questo link here

+1

Sei rock! Ancora una cosa dura, AssemblyQualifiedName della tua classe? La classe è "Lingua" per esempio. –

+1

Ho modificato la mia risposta. –

+0

Ciao di nuovo, sei sicuro che Html.Display (f.Name.ToString()) funzioni correttamente? Inoltre ho avuto qualche altra domanda sull'argomento, modificato la domanda? Ti stai dando un'occhiata? –

2

sono imbattuto in questa domanda, ha scritto questo forse sarà aiutare qualcun altro. Questo codice caricherà dinamicamente il tuo modello in una tabella.

@model System.Collections.Generic.List<App.Client.Models.MyModel> 

<table> 
    <thead> 
     <tr> 
      @foreach (var property in Model.GetType().GetGenericArguments()[0].GetProperties()) 
      { 
       <th>@property.Name</th> 
      } 
     </tr> 
    </thead> 
    <tbody> 
     @foreach (var modelItem in Model) 
     { 
      <tr> 
       @foreach (var property in modelItem.GetType().GetProperties()) 
       { 
        <td>@property.GetValue(modelItem)</td> 
       } 
      </tr> 
     } 
    </tbody> 
</table> 
+0

Abbastanza impressionante. Grazie! – Red

+0

E per quanto riguarda DisplayName()? – Romias

Problemi correlati