SelectMethod为ObjectDataSource调用了两次

时间:2013-11-19 21:22:54

标签: c# asp.net webforms repository-pattern objectdatasource

因为我是ASP.NET webforms和Entity框架的新手,所以我正在尝试一个宠物项目。

在此期间,我遇到了以下我想要了解的内容:

  1. 我有一个ObjectDataSource(名为EmployerObjectDataSource),它使用业务逻辑层(BLL)对象的方法来选择数据 - 方法是GetEmployer
  2. 在我的页面的Page_PreRender回调中,我调用方法populateFields来填充FormView中的字段
  3. populateFields我致电EmployerObjectDataSource.Select()以获取Employer记录。
  4. 如果有任何记录返回,则我使用返回记录中的值填充文本框。
  5. 以下是代码:

        //Following Dmytro's comment, I will use Page_Load instead, however this 
        //does not resolve the problem
        //protected void Page_PreRender(object sender, EventArgs e)
        protected void Page_Load(object sender, EventArgs e)
        {
            _username = "Lefteris";
            _version = 1;
    
            if (!Page.IsPostBack)
            {
                populateFields();
            }
        }
    
        private bool populateFields()
        {
            //IEnumerable<Employer> empl = ((IEnumerable<Employer>)EmployerObjectDataSource.Select()).ToList();
    
            //The GetEmployer method of BLL is called here (as expected)
            List<Employer> empl = (List<Employer>)EmployerObjectDataSource.Select();
    
            System.Threading.Thread.Sleep(1000);
            if (empl.Count() == 1)
            {
                Employer employer = empl.First();
    
                //The GetEmployer method of BLL is called here (WHY????)
                ((RadTextBox)EmployerFormView.Row.FindControl("txtAme")).Text = employer.AME.ToString();
                ((RadTextBox)EmployerFormView.Row.FindControl("txtAfm")).Text = employer.EmplrAFM.ToString();
                ((RadTextBox)EmployerFormView.Row.FindControl("txtName")).Text = employer.EmplrLastName.ToString();
      ...
    

    GetEmployer如下所示:

        public List<Employer> GetEmployer(string username, short version)
        {
            DateTime today = DateTime.Today;
            List<Employer> employers = (ikaRepository.GetEmployers(username, today, version)).ToList<Employer>();
    
            Debug.Assert(employers.Count() <= 1, "This is a logical Error - Can we have more than one active Employer records per user?");
            return employers;
        }
    

    以下是问题: 当我附加调试器时,我看到BLL的GetEmployer方法被调用了两次。首次访问.Select(),第二次尝试获取Employer记录的第一个字段的值。

    谢谢

1 个答案:

答案 0 :(得分:4)

我的英语不好,我提前道歉。

您在代码隐藏中手动绑定FormViewObjectDataSource。因此,您在Select 正在加载阶段(基于当前代码)调用Page方法一次。

您是否在标记(ASPX内容)中为"EmployerObjectDataSource" EmployerFormView分配了DataSourceID,并在FormView中将ObjectDataSource绑定到Page } 事件处理阶段(Load阶段之后),因此再次调用Select方法。

最好不要手动将DataBoundControls(例如FormView)绑定到DataSourceControls(例如ObjectDataSource)。相反,如果需要将一些数据传递给BLL以选择/过滤逻辑,则可以在SelectParameters标记内使用ObjectDataSource

我认为这种情况就是发生了什么。我建议你也应该写下你的标记。

另一种情况是将一个ObjectDataSource绑定到多个DataBoundControls。 在这种情况下,每个DataBoundControls会在其绑定时间内调用ObjectDataSource的{​​{1}}方法。要处理这种情况,您可以使用Select的缓存功能。

我希望这些解释有用。

我建议您在使用ASP.NET数据控件之前阅读这些资源:

  1. ObjectDataSource on MSDN
  2. FormView on MSDN
  3. ASP.NET Page Life Cycle Overview on MSDN
  4. 祝你好运!