首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SelectMethod为ObjectDataSource打了两次电话

SelectMethod为ObjectDataSource打了两次电话
EN

Stack Overflow用户
提问于 2013-11-19 21:22:54
回答 1查看 2.3K关注 0票数 1

由于我是ASP.NET webforms和实体框架的新手,我正在试验一个宠物项目。

在此期间,我遇到了以下几点,我正在努力理解:

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

以下是代码:

代码语言:javascript
复制
    //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如下所示:

代码语言:javascript
复制
    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记录的第一个字段的值。

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-11-22 19:08:32

我英语不太好,抱歉,提前说。

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

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

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

我认为这种情况就是这样发生的。我建议你也写上你的标价。

另一种情况是将一个ObjectDataSource绑定到多个DataBoundControls。在这种情况下,每个DataBoundControls都会在绑定时间上调用ObjectDataSourceSelect方法。要处理这种情况,可以使用ObjectDataSource的缓存功能。

我希望这些解释是有用的。

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

  1. MSDN上的ObjectDataSource
  2. MSDN上的FormView
  3. ASP.NET页面生命周期概述

祝好运!

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20082323

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档