簡體   English   中英

首先從數據庫過濾器記錄中使用EF Code的asp.net Webforms支架

[英]asp.net webforms scaffolding with EF Code first from database filter records

我正在使用EF Code First from Database方法,並在asp.net Web應用程序中創建了CRUD操作。 現在,我想在整個應用程序中過濾一些記錄。

我有客戶和產品類

客戶:

public partial class Client
{
    public Client()
    {
        Product = new HashSet<Product>();
    }

    [Key]
    public int ClientID { get; set; }

    [Required]
    [StringLength(5000)]
    public string ClientName { get; set; }

    public string Status { get; set; }

    public virtual ICollection<Product> Product{ get; set; }

產品:

public partial class Product
{
   public Product()
   {

   }
   public int Id { get; set; }
   public string Name { get; set; }
   public string Status { get; set; }
   public virtual Client Client { get; set; }

我想要的是獲得狀態=“有效”的產品和客戶

我不想在每個頁面上手動進行操作,而是在類級別上進行定義,以便可以特別在使用Formviews的Insert和Edit.aspx自動生成的動態頁面上自動完成。 請提出可能的方法。

我在我的項目中像這樣工作:這允許您添加自己的過濾器方法,或者僅添加FilterByAttribute來指定要過濾的列和要過濾的值。 通過檢查名稱類似於GetTableName的getMethod的存在進行工作,並在每個表上進行檢查。 您將需要在Global.asax文件中使用AdvancedMetaModel替換MetaModel。

希望這可以幫助。

    public class AdvancedMetaModel : MetaModel
{
    /// <summary>
    /// Creates the table.
    /// </summary>
    /// <param name="provider">The provider.</param>
    /// <returns></returns>
    protected override MetaTable CreateTable(TableProvider provider)
    {
        return new AdvancedMetaTable(this, provider);
    }
}

public class AdvancedMetaTable : MetaTable
{
    private SecureMetaModel SecureModel { get { return (SecureMetaModel)this.Model; } }

    public String GetMethodName { get; set; }

    private MethodInfo CreateQueryMethod { get; set; }

    /// <summary>
    /// Initializes a new instance of the <see cref="AdvancedMetaTable"/> class.
    /// </summary>
    /// <param name="metaModel">The meta model.</param>
    /// <param name="tableProvider">The table provider.</param>
    public AdvancedMetaTable(MetaModel metaModel, TableProvider tableProvider) :
        base(metaModel, tableProvider)
    {
        // set the Get Method Name
        var context = base.CreateContext();
        var getMethodName = DefaultGetMethodName;
        if (context != null && context.HasMethod(DefaultGetMethodName))
        {
            GetMethodName = getMethodName;
            this.CreateQueryMethod = this.DataContextType.GetMethod(GetMethodName);
        }
        else
            GetMethodName = String.Empty;

    }

    internal String DefaultGetMethodName
    {
        get { return String.Format("Get{0}", DataContextPropertyName); }
    }

    public override IQueryable GetQuery(object context)
    {
        var filterByAttribute = this.GetAttribute<FilterByAttribute>();

        if (this.CreateQueryMethod != null)
        {
            if (context == null)
                context = this.CreateContext();
            //this.Provider.GetQuery(context);
            var query = (IQueryable)this.CreateQueryMethod.Invoke(context, null);

            if (this.SortColumn != null)
                return query.GetQueryOrdered((MetaTable)this);
            else
                return query;
        }
        else if (filterByAttribute != null)
        {
            MetaColumn filterByColumn = this.GetColumn(filterByAttribute.ColumnName);
            var query = base.GetQuery(context).GetQueryFilteredByColumn(filterByColumn, filterByAttribute.ValueWhenTrue);
            return query;
        }
        else
        {
            var query = base.GetQuery(context);
            return query;
        }
    }
}
[AttributeUsage(AttributeTargets.Class, AllowMultiple = false)]

public class FilterByAttribute:Attribute {//此屬性必須與“ AllowMultiple = true”一起使用ref David Ebbo //實現后,此標識符僅僅是屬性的Type。 但是,// //打算使用唯一標識符來標識同一類型的兩個//屬性。 公共重寫對象TypeId {獲取{返回此; }}

public String ColumnName { get; set; }

public Object ValueWhenTrue { get; set; }

public FilterByAttribute(String columnName, Object valueWhenTrue)
{
    ColumnName = columnName;
    ValueWhenTrue = valueWhenTrue;
}

她是自定義get方法的示例

公共IQueryable GetStations(){var context = System.Web.HttpContext.Current; var station = this.Stations.Where(s => s.Active);

if (!context.User.IsInRole("Acctg") && !context.User.IsInRole("Execs"))
{
    var user = MembershipHelpers.GetUser();
    var stationIds = user.Stations.Select(s => s.Id).Distinct().ToList();
    stations = stations.Where(s => stationIds.Contains(s.Id));
}

return stations;

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM