在转发器中定义变量?

时间:2010-01-26 09:45:02

标签: c# asp.net variables repeater

我喜欢处理和比较我的中继器中的很多日期时间,即使我必须使用相同的工作多次。

有点难看,要在Eval("MyDate") ((DateTime)Eval("MyDate"))之处投放,以减去2个日期时间或比较它,即使你必须在一次操作中做到这一点。

我想在转发器启动时保存var中​​的所有evals?

DateTime mydt1 = Eval("myDate");
DateTime mydt2 = Eval("mydate");

之后,在整个中继器中进行任何操作都很容易。希望你理解我的想法。这可能吗?我尝试过短暂但每次都有错误。

mydt1 - mydt2....

谢谢你,并致以最诚挚的问候。

3 个答案:

答案 0 :(得分:3)

您可以使用DateTimes作为参数从转发器调用页面代码后面的方法。如果目标是创建一个更清洁的aspx页面,那么可以在后面的代码中完成构建逻辑。

示例ASPX:

<asp:Repeater ID="Repeater1" runat="server">
    <ItemTemplate>
        <asp:Literal 
            ID="Literal1" 
            runat="server" 
            Text='<%# DateFoo(Eval("myDate1"), Eval("myDate2")) %>' />
    </ItemTemplate>
</asp:Repeater>

示例C#代码背后:

protected string DateFoo(Object o1, Object o2)
{
    DateTime? dt1 = o1 as DateTime?;
    DateTime? dt2 = o2 as DateTime?;

    // Do logic with DateTimes

    return "string";
}

答案 1 :(得分:1)

如果您想为转发器添加更多逻辑,我建议您将绑定逻辑移到后面的代码中:

ASPX:

<asp:Repeater id="myRepeater" runat="server">
    <ItemTemplate>
        <asp:Literal id="myLiteral" runat="server" />
    </ItemTemplate>
</asp:Repater>

CS:

protected override void OnInit(EventArgs e)
{
    myRepeater.ItemDataBound += myRepeater_ItemDataBound;
    base.OnInit(e);
}

void myRepeater_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
    // this method will be invoked once for every item that is data bound

    // this check makes sure you're not in a header or a footer
    if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
    {

        // this is the single item being data bound, for instance, a user, if 
        // the data source is a List<User>
        User user = (User) e.Item.DataItem;

        // e.Item is your item, here you can find the controls in your template

        Literal myLiteral = (Literal) e.Item.FindControl("myLiteral");

        myLiteral.Text = user.Username + ", " + user.LastLoginDate.ToShortDateString();

        // you can add any amount of logic here
        // if you need to use it, e.Item.ItemIndex will tell you what index you're at
    }
}

答案 2 :(得分:1)

我讨厌激情的逃避。 这就是为什么我使用这段代码永远摆脱它们并回到强类型

    public static class DataItemExtensions
{
         public static T As<T>(this IDataItemContainer repeater) where T : class
    {
        return (T)repeater.DataItem;
    }

    public static dynamic AsDynamic(this IDataItemContainer repeater)
    {
        return repeater.DataItem;
    }
}

然后像这样使用它:

<asp:Repeater runat="server" DataSource="<%# this.MyObjectCollection %>">
 <ItemTemplate>
   <%# Container.As<MyObject>().DateTime %>
  </ItemTemplate>
</asp:Repeater>

请注意,如果您像我一样使用数据源,则需要在页面上使用this.DataBind()。