2012-05-04 24 views
0

我想添加一個只有從數據庫檢索某些東西的參數鏈接。如何<%# Eval() %>並改變日期

這裏是我的代碼:

protected void GetOrderLines (string OrderID) 
{ 
    string query; 
    query = "SELECT ol.ItemId, ol.Amount, ol.Quantity, i.description, ol.RetailPrice, o.OrderDate"; 
    query += " FROM Distributor d"; 
    query += " INNER JOIN Orders o"; 
    query += " ON o.DistID = d.DistID"; 
    query += " INNER JOIN Orderlines ol"; 
    query += " ON ol.OrderID = o.OrderID"; 
    query += " INNER JOIN Items i"; 
    query += " ON i.InventoryID = ol.ItemID"; 
    query += " WHERE ol.OrderID = " + OrderID; 
    query += " AND ol.GroupItem = 0"; 
    query += " AND d.DistID = " + Session[ "Distid" ]; 

    DataTable data = GeneralFunctions.GetData(query); 

    RepeaterOrderlineInfo.DataSource = data; 
    RepeaterOrderlineInfo.DataBind(); 
} 

這裏是它給我的數據:

ItemId Amount Quantity description RetailPrice OrderDate 
6015 660 1 Item 1 660 5/1/2012 
6021 199.2 332 Item 2 0.6 5/1/2012 
6018 150 6 Item 3 25 5/1/2012 
9000 85 4 Technical Support 21.25 5/1/2012 
8000 125 4 Custom Programming and Misc. Fees 31.25 5/1/2012 

這裏是頁面上的評估和演示代碼:

<asp:Repeater ID="RepeaterOrderlineInfo" runat="server"> 
    <ItemTemplate> 
     <tr> 
      <td> 
       <%# Eval("Itemid") %> 
      </td> 
      <td> 
       <%# Eval("description") %> 
      </td> 
      <td align="right"> 
       <%# Eval("RetailPrice", "{0:C}") %> 
      </td> 
      <td align="right"> 
       <%# Eval("Quantity") %> 
      </td> 
      <td align="right"> 
       <%# Eval("Amount", "{0:C}")%> 
      </td> 
     </tr> 
    </ItemTemplate> 
</asp:Repeater> 

我想建立鏈接爲<%# Eval("Description") %>

<a href="SupportSummary.aspx?sd="<%# Eval("OrderDate") %>&ed=<%# Eval("OrderDate") //- 1 month %>"><%# Eval("Description") %> 

我只需要說明是一個鏈接,如果description = "Technical Support"。這在使用中繼器時可能嗎?

所以我在這裏尋求的主要事情是:

如何EVAL的OrderDaye並在一個月減。 如何僅在描述=「技術支持」時對描述進行描述。

+2

小鮑比表將會得到你。 – jason

+0

@Jason我不確定你想說什麼。 :) –

+1

他試圖說,你真的打開自己的SQL注入攻擊通過concatonating一個字符串(大概是一個直接從Web窗體?)到您的SQL查詢。另外,我會特別擔心Session [「Distid」]來自哪裏。 ADO.NET確實有參數化的SqlCommands ...使用它們! (這是參考http://xkcd.com/327/) –

回答

1

如果添加一個方法到你的代碼隱藏,你可以在你的中繼這樣稱呼它:

<%# MyMethod(Eval("Description"),Eval("OrderDate")) %> 

的方法是這樣的:

protected string MyMethod(object description, object orderDate) 
{ 
    string link = String.Empty; 

    // conditions, assign link if needed 

    return link; 
} 
+0

我打算玩這個,我想我理解這個足以把它整合進去。 –

+0

我能夠得到這個工作,謝謝! –

2

您確實需要使用中繼器切換到OnItemCreated,以便對輸出的標記進行很多控制。這很容易做到,如下所示:

<asp:Repeater ID="RepeaterOrderlineInfo" runat="server"> 
    <ItemTemplate> 
     <asp:Label ID="labelDate" runat="server" /> 
    </ItemTemplate> 
</asp:Repeater> 

RepeaterOrderlineInfo.ItemCreated += Repeater_ItemCreated; 

protected void Repeater_ItemCreated(object sender, RepeatrItemCreatedEventArgs e) 
{ 
    DataRow dataItem = e.Item.DataItem as DataRow; 

    if(dataItem != null) 
    { 
     Label labelDate = e.Item.FindControl("labelDate") as Label; 

     if(labelDate != null && row["Description"] != "TechnicalSupport") 
      labelDate.Text = // whatever you want to do 
    } 
} 

這使您在製作表格時具有極大的靈活性。老實說,我會盡量避免Eval(<string>)在你的標記中,而是在你的代碼中處理大部分這個。

+0

我確信這樣做會有效,但我可能無法理解如何整合這個到我現有的東西。我還是很新的asp.net。 –

+0

這是更好的方法來使用。您也可以使用此方法對OrderID進行加密,以消除上面提到的有關安全性的問題。 – TheGeekYouNeed

1

TEJS'和mafue的答案是正確的,但你也可以做到這一點>>

<%# Eval("Description").ToString().Equals("Technical Support", StringComparison.OrdinalIgnoreCase) ? link : String.Empty %> 
相關問題