Убираем таблицы с главной в приложениях ASP.NET Dynamic Data

четверг, 8 июля 2010, Александр Краковецкий

Иногда возникает ситуация, когда в ASP.NET Dynamic Data приложении на главной странице необходимо отображать не все таблицы. Как это сделать, рассмотрим ниже.

Сначала создадим атрибут HideTableInDefaultAttributte:

[AttributeUsage(AttributeTargets.Class)]
public class HideTableInDefaultAttribute : Attribute
{
    public Boolean Hide { get; private set; }
 
    public HideTableInDefaultAttribute(Boolean hide)
    {
        Hide = hide;
    }
    // this will allow us to have a default set to false
    public static HideTableInDefaultAttribute Default =
        new HideTableInDefaultAttribute(false);
}

Далее немножко модифицируем код в Default.aspx:

protected void  Page_Load(object  sender, EventArgs e)
{
    System.Collections.IList visibleTables = Global.DefaultModel.VisibleTables;
    if (visibleTables.Count == 0)
        throw new InvalidOperationException(
            @"There are no accessible tables.
            Make sure that at least one data model is
            registered in Global.asax and scaffolding is
            enabled or implement custom pages.");
 
    //Menu1.DataSource = visibleTables;
    //Menu1.DataBind();
 
    // Hiding tables
    var tablesMain = (from t in Global.DefaultModel.VisibleTables
                     where !t.Attributes.OfType().
                        DefaultIfEmpty(HideTableInDefaultAttribute.Default).First().Hide
                     orderby t.DisplayName
                     select t).ToList();
 
    Menu1.DataSource = tablesMain;
    Menu1.DataBind();
}

Мы заменили visibleTables только на те таблицы, которые не помечены атрибутом HideTableInDefaultAttributte. По умолчанию все таблицы должны показываться на главной.

Далее в классе с метаданными необходимо пометить те таблицы, которые мы не хотим видеть на главной:

// note the differance in the result of using
// ScaffoldTable(false) over HideTableInDefault(true)
[ScaffoldTable(false)]
public partial class Category
{
}
 
[HideTableInDefault(true)]
public partial class EmployeeTerritory
{
}
 
[HideTableInDefault(true)]
public partial class Product
{
}

В результате мы не увидим помеченные таблицы в списке на главной:

Limited Tables list from Northwind

See how the Products column
 has a foreign key link

Note that the Category column has no 
link

Замечание: так как мы пометили Category как ScaffoldTable(false), то на странице Details мы не увидим ссылку на соответствующую категорию, в то время когда в Order_Details ссылка Product присутствует.

via csharpbits.


Ищите нас в интернетах!

Комментарии

Свежие вакансии