2012-12-17 20 views
5

için Görüntüleme şimdilik aşağıdaki Razor hatları vardır: AncakASP.NET MVC Razor Başlıkları ve Her Sütun dinamik

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

, ben veritabanı tablosuna programdan otomatik olarak bazı sütunlar ekler. Bu th ve td'leri buna göre basmanın bir yoluna ihtiyacım var. Kısacası, Modelin dinamik sütunlarına gitmenin bir yoluna ihtiyacım var. Bunu nasıl başarabilirim?

DÜZENLEME: Modelim buraya "Teklif" şeklindedir. Ancak, ben Proposal.Type.Word (Tr, En, veya başka bir eklenen Dil Enum) dinamik özniteliğine ulaşmak istiyorum. Nasıl yapabilirim Ben Jilet Dizim olarak işlenecek bir dize eklemek Can

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

Ben Jilet Dize

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

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

alabilirim? Evet ise nasıl?

+0

Görünümünüzü nasıl yazdırabilirsiniz? –

+0

Evet ya da hayır, önemli değil. Soruma göre çalışan herhangi bir cevaba göre değişebilirim. –

cevap

6

Bu kodu denedim ve sınıfınızın assemply Kalifiye Adı almak için

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

çalışır bu bağlantıyı here

+1

Siz sallanıyorsunuz! Bir şey daha sert, sınıfınızın AssemblyQualifiedName? Sınıf, örneğin "Dil" dir. –

+1

Cevabımı düzenledim. –

+0

Tekrar merhaba, emin misiniz Html.Display (f.Name.ToString()) doğru çalışıyor mu? Ayrıca konuyla ilgili bazı sorularım var, soruyu düzenlediniz mi? Göz atıyor musun? –

2

bakın bu soruya genelinde geldi bu belki başkası yardımcı olacaktır yazdı. Bu kod, modelinizi dinamik olarak bir tabloya yükler.

@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

Oldukça harika. Teşekkür ederim! – Red

+0

Peki ya DisplayName()? – Romias

İlgili konular