2012-12-17 11 views
5

mam następujące wiersze Razor teraz:ASP.NET MVC Razor Główki i widoki dla każdej kolumny Dynamicznie

<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> 

Jednak dodam kilka kolumn automatycznie z programu do tabeli bazy danych. Potrzebuję sposobu, aby wydrukować odpowiednio te i td. Krótko mówiąc, potrzebuję sposobu na przejście przez dynamiczne kolumny modelu. Jak mogę to osiągnąć?

EDIT: Mój typ modelu to "Wniosek". Jednak chcę osiągnąć dynamiczny atrybut Proposal.Type.Word (Tr, En lub dowolną inną dodaną enumę językową). Jak mogę?

@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> 
} 

mogę Razor String

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

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

mogę wstawić ciąg być renderowany jako składni Razor? Jeśli tak, w jaki sposób?

+0

Czy Twój widok jest mocno napisany? –

+0

Tak lub nie, nie ma znaczenia. Mogę się zmienić zgodnie z każdą działającą odpowiedzią na moje pytanie. –

Odpowiedz

6

Próbowałem tego kodu i działa

<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> 

Aby uzyskać Assemply kwalifikowana nazwa klasy, zobacz ten link here

+1

Skałasz! Jeszcze jedno trudne, AssemblyQualifiedName twojej klasy? Klasa to na przykład "Język". –

+1

Edytowałem swoją odpowiedź. –

+0

Witam ponownie, czy na pewno Html.Display (f.Name.ToString()) działa poprawnie? Dostałem również kilka pytań na ten temat, zredagowałem pytanie? Czy chcesz się przyjrzeć? –

2

Natknąłem się na to pytanie, napisałem to może pomoże to komuś innemu. Ten kod będzie dynamicznie ładował twój model do tabeli.

@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

Dość niesamowite. Dziękuję Ci! – Red

+0

A co z DisplayName()? – Romias

Powiązane problemy