因为我是ASP.NET webforms和Entity框架的新手,所以我正在尝试一个宠物项目。
在此期间,我遇到了以下我想要了解的内容:
EmployerObjectDataSource
),它使用业务逻辑层(BLL)对象的方法来选择数据 - 方法是GetEmployer
Page_PreRender
回调中,我调用方法populateFields
来填充FormView中的字段populateFields
我致电EmployerObjectDataSource.Select()
以获取Employer
记录。 以下是代码:
//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
记录的第一个字段的值。
谢谢
答案 0 :(得分:4)
我的英语不好,我提前道歉。
您在代码隐藏中手动绑定FormView
到ObjectDataSource
。因此,您在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数据控件之前阅读这些资源: