2013-03-08 2 views
0

Я хочу рассчитать возраст внутри ретранслятора с существующим полем.Как сделать вычитание даты для элемента в ретрансляторе asp.net

Запроса для заполнения ретранслятора:

var qryGetAllBeneficiaries = from p in dbRRSP.Person 
     join rt in dbRRSP.RelationshipType on p.RelationshipTypeId equals rt.RelationshipTypeId 
      where p.PlanId == qryPersonDetails.PlanId 
      orderby p.LastName 
     select new 
       { 
      BeneficiaryLastName = p.LastName, 
      BeneficiaryFirstName = p.FirstName, 
      BeneficiaryMiddleName = p.MiddleName, 
      BeneficiaryAka = p.Aka, 
      BeneficiaryBirthday = p.Birthdate, 
      BeneficiaryRelationshipToClient = rt.RelationshipTypeDescription 
          }; 

      rptBeneficiary.DataSource = qryGetAllBeneficiaries; 
      rptBeneficiary.DataBind(); 

самого Repeater:

<asp:Repeater ID="rptBeneficiary" runat="server"> 
    <HeaderTemplate> 
    <table>  
    <tr> 
    <td class="labels displayInput_noWidth">Last Name</td> 
    <td class="labels displayInput_noWidth">First Name</td> 
    <td class="labels displayInput_noWidth">Middle Name</td> 
    <td class="labels displayInput_noWidth">Aka</td> 
    <td class="labels displayInput_75w">Birthday</td> 
    <td class="labels displayInput_noWidth">Age</td> 
    </tr>      
    </HeaderTemplate> 

    <ItemTemplate> 
    <tr> 
    <td><%#DataBinder.Eval(Container.DataItem, "BeneficiaryLastName") %></td> 
    <td><%#DataBinder.Eval(Container.DataItem, "BeneficiaryFirstName") %></td> 
    <td><%#DataBinder.Eval(Container.DataItem, "BeneficiaryMiddleName") %></td> 
    <td><%#DataBinder.Eval(Container.DataItem, "BeneficiaryAka") %></td> 
    <td><%#DateTime.Parse(DataBinder.Eval(Container.DataItem, "BeneficiaryBirthday").ToString()).ToString("MM/dd/yyyy")%></td> 
    <td> <%(DateTime.Today.Subtract(DateTime.Parse(DataBinder.Eval(Container.DataItem, "BeneficiaryBirthday").ToString())).Days/365).ToString()%></td> 


    </tr>        
    </ItemTemplate> 
    <FooterTemplate> 
    </table> 
    </FooterTemplate> 
    </asp:Repeater> 

Я понял, как только формат в строки даты мне нравится, но то, что я ищу, чтобы вычитать сегодняшнюю дату со дня рождения, чтобы получить возраст каждого Бенефициара в ретрансляторе.

Я пытался сделать следующий расчет:

<td> <%(DateTime.Today.Subtract(DateTime.Parse(DataBinder.Eval(Container.DataItem, "BeneficiaryBirthday").ToString())).Days/365).ToString()%></td> 

, но он не признает DataBinder.Eval контейнер и попросил меня, чтобы добавить еще используя оператор: System.ComponentModel.Container. Может ли кто-нибудь сказать мне, что мне не хватает? Заранее спасибо.

+0

Какую версию .NET вы используете? – magnattic

+0

Вам нужно сделать это в самом репитере? Почему в запросе не нужно заполнять репитер? –

+0

atticae: .Net 4.0 – silvenwolf

ответ

1

Вы отсутствуете в коде на #:

Написать

<td> <%#(DateTime.Today.Subtract(... 

вместо

<td> <%(DateTime.Today.Subtract(... 

Вы можете использовать только переменный контейнер в контексте привязки данных, которые вы не» t, если вместо синтаксиса привязки данных используется обычный синтаксис самородок.

Также вы можете сократить код, если вы просто напишите Eval("yxz") вместо DataBinder.Eval(Container.DataItem,"xyz"). Первая - это сокращенное обозначение второго, где автоматически принимается dataitem.

+0

Спасибо - удалили некоторые дополнительные ошибочные скобки и добавили это, и это работает как сон! – silvenwolf

0

Похоже, вы упускаете #

<td> <%#(DateTime.Today.Subtract(DateTime.Parse(DataBinder.Eval(Container.DataItem, "BeneficiaryBirthday").ToString())).Days/365).ToString()%></td> 

В качестве альтернативы, хотя, рассмотреть вопрос о создании метода, чтобы обернуть вашу коллекцию и используя Еогеасп:

<table>  
    <tr> 
     <td class="labels displayInput_noWidth">Last Name</td> 
     <td class="labels displayInput_noWidth">First Name</td> 
     <td class="labels displayInput_noWidth">Middle Name</td> 
     <td class="labels displayInput_noWidth">Aka</td> 
     <td class="labels displayInput_75w">Birthday</td> 
     <td class="labels displayInput_noWidth">Age</td> 
    </tr> 
    <% foreach (var beneficiary in GetBenificiaries()) 
    {%> 
    <tr> 
     <td><%= beneficiary.BeneficiaryLastName %></td> 
     <td><%= beneficiary.BeneficiaryFirstName %></td> 
     <td><%= beneficiary.BeneficiaryMiddleName %></td> 
     <td><%= beneficiary.BeneficiaryAka %></td> 
     <td><%= beneficiary.BeneficiaryBirthday.ToString("MM/dd/yyyy")%></td> 
     <td> <% DateTime.Now.Subtract(beneficiary.BeneficiaryBirthday).Days/365%></td> 
    </tr> 
    <%}%> 

Этот путь это намного более читаемо, вы получаете сильную типизированную intellisense, она более тесно связана с MVC, если вы когда-либо проходили миграцию, и если вы используете такие инструменты, как resharper, они смогут реорганизовать ese меняется лучше

+0

Я не согласен. В контексте WebForms Repeater - это путь сюда. Если вы хотите что-то подобное предложить, сделайте переход на ASP.NET MVC и сделайте это правильно с помощью бритвы. То, что вы предлагаете, - это шаг назад от ASP.NET до старого поколения кода ASP. – magnattic

+0

Игнорировать факт, о котором я упомянул MVC, но у них все еще есть много преимуществ для этого подхода. Возможность использовать сильную типизацию над DataBinder и явное литье/синтаксический анализ достаточно для меня. В конце концов, любой из этих подходов должен будет использовать классические теги ASP-сервера. – jjacka

+1

Вы можете добиться сильной типизации, явного разбора и intellisense с помощью ASP.NET 4.5: http://weblogs.asp.net/scottgu/archive/2011/09/02/strongly-typed-data-controls-asp-net -vnext-series.aspx – magnattic

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