2012-05-04 11 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"の場合はリンクのみに記述する必要があります。リピータを使用する場合はこれが可能ですか?

だから私はここに求めている主なものは以下のとおりです。

OrderDayeを評価および1ヶ月減算する方法。 説明が "テクニカルサポート"の場合にのみ、説明の条件を行う方法。

+2

リトルボビーテーブルがあなたを手に入れようとしています。 – jason

+0

@Jason私は、あなたが何を言おうとしているのか分かりません。 :) –

+1

彼は文字列(おそらくWebフォームから直接来る文字列)をSQLクエリに連結することによって、あなたが本当に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'とマフエの答えは正しいですが、あなたもこれを行うことができます。>>

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