2012-05-04 21 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 %> 
相关问题