2009-12-11 13 views
6

Görünümümdeki spagetti kodunu azaltmak için belirli bir HtmlHelper tablo uzantısı oluşturmaya çalışıyorum.Nesnelerin listesinden MVC HtmlHelper tablosu nasıl oluşturulur?

Etki alanı nesnelerinin bir listesini almak Etki alanı nesnesinin özelliklerini sütun olarak kullanmanın biraz daha akıllı bir tablosunu görüntülemek istiyorum. Ayrıca, bazı özelliklerin sütun olarak gösterilmesini devre dışı bırakmak istiyorum. Bir fikir, gösterilmemesi gerektiğini söyleyen özelliklerle özellikleri süslemek olacaktır. Ben şimdiye kadar var burada nerede mantıklı ama

Umarım ... var

public static string MyTable(this HtmlHelper helper, string name, 
    IList<MyObject> items, object tableAttributes) 
{ 
    if (items == null || items.Count == 0) 
     return String.Empty; 

    StringBuilder sb = new StringBuilder(); 
    BuildTableHeader(sb, items[0].GetType()); 

    //TODO: to be implemented... 
    //foreach (var i in items) 
    // BuildMyObjectTableRow(sb, i); 

    TagBuilder builder = new TagBuilder("table"); 
    builder.MergeAttributes(new RouteValueDictionary(tableAttributes)); 
    builder.MergeAttribute("name", name); 
    builder.InnerHtml = sb.ToString(); 

    return builder.ToString(TagRenderMode.Normal); 
} 

private static void BuildTableHeader(StringBuilder sb, Type p) 
{ 
    sb.AppendLine("<tr>"); 

    //some how here determine if this property should be shown or not 
    //this could possibly come from an attribute defined on the property   
    foreach (var property in p.GetProperties()) 
     sb.AppendFormat("<th>{0}</th>", property.Name); 

    sb.AppendLine("</tr>"); 
} 

//would be nice to do something like this below to determine what 
//should be shown in the table 
[TableBind(Include="Property1,Property2,Property3")] 
public partial class MyObject 
{ 
    ...properties are defined as Linq2Sql 
} 

Yani sadece merak kimse bu fikir ya da herhangi bir alternatifleri üzerinde herhangi görüş/öneri olsaydı?

cevap

1

Bir saatlik çalışmadan sonra istediğimi oluşturabiliyordum. Benim çözümüm, tablodaki hangi özelliklerin görünür olduğunu belirten etki alanı sınıfı sınıfında bir öznitelik oluşturmaktı.

MVC 1.0'daki BindAttribute özniteliğine dayanarak (kaynak koduna bakın), bir TableProperty özniteliği oluşturdum.

[AttributeUsage(AttributeTargets.Class, AllowMultiple = false, Inherited = true)] 
public class TableProperty : Attribute 
{ 
    private string m_include; 
    private string[] m_includeSplit; 

    public TableProperty() 
    { 
     m_includeSplit = new string[0]; 
    } 

    public string Include 
    { 
     get 
     { 
      return (m_include ?? string.Empty); 
     } 
     set 
     { 
      m_include = value; 
      m_includeSplit = value.Split(','); 
     } 
    } 

    public bool IsPropertyAllowed(string propertyName) 
    { 
     return IsPropertyAllowed(propertyName, m_includeSplit); 
    } 

    internal static bool IsPropertyAllowed(string propertyName, string[] includeProperties) 
    { 
     return ((includeProperties == null) || (includeProperties.Length == 0)) || includeProperties.Contains<string>(propertyName, StringComparer.OrdinalIgnoreCase); 
    } 
} 

Bu beni bu özellik ile Alan nesnesi süslemek için izin ...

[TableProperty(Include="Property1,Property2,Property3")] 
public partial class MyObject 
{ ... 

Sonra BuildTableHeader içimde nesnenin özelliklerini almak ve izin verilen listeye her özellik maç için yansıma kullanılan .

private static void BuildTableHeader(StringBuilder sb, Type p) 
{ 
    sb.AppendLine("<tr>"); 

    TableProperty tp = p.GetCustomAttributes(typeof(TableProperty), true)[0]; 

    foreach (var property in p.GetProperties()) 
     if (tp.IsPropertyAllowed(property.Name)) 
      sb.AppendFormat("<th>{0}</th>", property.Name); 

bu çözüm ancak daha iyi bir uygulama için MVCContrib en Izgarasındaki daha arıyor olacak benim küçük uygulamada benim için çalıştı unutmayınız.

+0

Ayrıca, istemci tarafı esnekliğine ihtiyacınız varsa jqGrid'i düşünün. – queen3

1

şiddetle MVCContrib en Grid kullanmanızı öneririz. Yapmamaya karar verirseniz, en azından tablo oluşturma arabirimi sorununu nasıl çözdüğüne göz atabilirsiniz.

+0

Kılavuzun bağlantısı için teşekkürler. Buna bir bakacağım, ancak şimdilik bunu kendim gerçekleştirdim. – David

İlgili konular