2010-01-26 74 views
1

我喜歡在我的轉發器中處理和比較很多日期時間,即使我必須使用相同的方法工作多次。在中繼器中定義變量?

這是一個有點醜陋,投擲到處都Eval("MyDate")((DateTime)Eval("MyDate"))減去2日期時間或比較它,即使你必須這樣做比在一個操作。

我想在轉發器的開始處保存var中​​的所有evals?

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

之後,很容易在整個中繼器中做任何操作。希望你能理解我的想法。這可能嗎?我嘗試了短暫的但每次錯誤。

mydt1 - mydt2.... 

謝謝,最好的問候。

+0

難道你不能在你的數據源中進行計算並返回一個新列嗎?這似乎是將UI與邏輯分開的最佳方式。 – 2010-01-26 09:49:21

+0

嗯。但是用c#進行操作要容易得多。 – 2010-01-26 09:53:27

回答

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

如果你想更多的邏輯添加到您的中繼器,我建議你移動綁定邏輯到後面的代碼:

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 
    } 
} 
1

我討厭evals與激情。 這就是爲什麼我使用此代碼永遠擺脫他們,回到強類型

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()。