2013-11-19 3 views
1

, поскольку я новичок в веб-формах ASP.NET и инфраструктуре Entity, я экспериментирую с домашним проектом.SelectMethod дважды вызывается для ObjectDataSource

За это я наткнулся, после чего я пытаюсь понять:

  1. У меня есть ObjectDataSource (называемый EmployerObjectDataSource), который использует метод бизнес-логики (BLL) объекта для выбора данных - метод GetEmployer
  2. в Page_PreRender обратного вызова моей страницы, я называю метод populateFields для заполнения полей в FormView
  3. в populateFields я зову EmployerObjectDataSource.Select() получить Employer ЗАП артиллерия
  4. Если есть возвращенные записи, я заполняю текстовые поля значениями из возвращенной записи.

Вот код:

//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; 
    } 

Вот вопрос: Когда я прикрепил отладчик, я увидел, что GetEmployer метод BLL вызывается дважды. Первый раз на .Select() и во второй раз, когда я пытаюсь получить значение первого поля записи Employer.

Спасибо

+0

Зачем вы связываете данные в PreRender вместо Load? –

+0

@DmytroRudenko Я пытался решить другую проблему и оставил ее вот так. Вы правы в том, что Page_Load более уместен, однако это не имело никакого значения для моей опубликованной проблемы. – Lefteris

+0

Возможно, у вас есть некоторый sode в getter собственности работодателя.AME? Я не могу найти другую причину, по которой Select() может вызываться дважды. –

ответ

4

Я не очень хорошо на английском языке, я извиняюсь, заранее.

Вы связали вручную FormView по номеру ObjectDataSource с кодом. Итак, вы вызвали метод Select один раз в PageЗагрузка фаза (на основе текущих кодов).

Вы назначены "EmployerObjectDataSource" в EmployerFormView «s DataSourceID в ваших пометок (содержание ASPX), и связать FormView с ObjectDataSource в PageОбработка событий фазы (после Load фазы), поэтому его называют Select метод еще раз.

Лучше, чтобы вы не привязывали вручную DataBoundControls (например, FormView) до DataSourceControls (например, ObjectDataSource). Вместо этого вы можете использовать SelectParameters внутри разметки ObjectDataSource, если ему нужно передать некоторые данные BLL для выбора/фильтрации логики.

Я думаю, что в этой ситуации произошло то, что произошло. Я предлагаю вам также написать свои надбавки.

Другая ситуация является обязательной для одного ObjectDataSource для более одного DataBoundControls. В этой ситуации каждый DataBoundControls вызовет метод ObjectDataSourceSelect на его привязке-времени. Чтобы справиться с этой ситуацией, вы можете использовать возможности кеширования ObjectDataSource.

Я надеюсь, что эти объяснения будут полезны.

Я предлагаю вам прочитать эти ресурсы перед использованием элементов управления ASP.NET данных:

  1. ObjectDataSource on MSDN
  2. FormView on MSDN
  3. ASP.NET Page Life Cycle Overview on MSDN

Удачи!

+0

(+1) Вы также можете упомянуть, что 'FormView' требует только записи или строки, а не многих записей, поэтому привязка к нескольким элементам управления ObjectDataSource может вызвать некоторые конфликты. – umlcat

Смежные вопросы