2008-12-15 73 views
8

我有一些代碼可以將數據庫值打印到asp.net頁面上的中繼器控件中。但是,返回的一些值爲空/空 - 這使得在存在空格時結果看起來很難看。ASP.net中的條件邏輯頁面

你如何做asp.net控件中的條件邏輯,即打印出一個值(如果存在的話),否則就轉到下一個值。

我還應該添加 - 我希望標記也是有條件的,就好像沒有值,我不想要
標記。

這裏是下面的代碼片段,只是爲了顯示我從數據庫中取回的值的類型。 (通常地址2根本沒有任何價值)。

<div id="results"> 
    <asp:Repeater ID="repeaterResults" runat="server"> 
     <ItemTemplate> 
      Company:  <strong><%#Eval("CompanyName") %></strong><br /> 
      Contact Name: <strong><%#Eval("ContactName") %></strong><br /> 
      Address:  <strong><%#Eval("Address1")%></strong><br />      
          <strong><%#Eval("Address2")%></strong><br />.................. 

非常感謝

回答

6

這將是一個非常主觀的這個,因爲它完全取決於你想在哪裏以及如何處理空/空值,實際上它那些你正在處理兩者之一。例如,有些人喜歡在數據庫級別處理空值,有些人喜歡在業務邏輯層中編寫默認值,而另一些人喜歡在UI中處理默認值/空值(更不用說其間的過多選項) 。

無論採用哪種方式,我個人的選擇都是爲了避免混淆,以確保您在UI級別顯示沒有數據可用於該字段。在沿線的最壞的東西:

<strong><% If (Eval("Address2").Length > 0) Then %><%#Eval("Address2")%><% Else %>No data available for Address 2<% End If %></strong><br /> 

這樣,至少,用戶就知道沒有數據可用,而不是不知道是否已經有一些系統/管理錯誤。

希望幫助:)

1

您可以使用IsDBNull以便(OBJ)

If IsDbNull(<%#Eval("Address2")%>) then 
    etc 
End If 
+0

這是C#:雖然IsDBNull以便在()可通過Microsoft.VisualBasic命名空間 – 2008-12-15 14:24:07

3

可能有辦法做到這一點,我通常使用中繼器的事件OnItemDataBound發生事件時,中繼器的產品綁定到數據項。

解釋OnItemDataBound事件讓我們假設我們有一個始終顯示的字段(Name)和可選的字段(如果不爲null(可選)時顯示)的中繼器。此外,如果可選字段爲空或空白,我們希望顯示一些預定義的值。
爲此,我們首先需要設置中繼器的OnItemDataBound事件以指向方法,並且還要構建中繼器的項目模板。我們可以在Repeater的項目模板中使用任何服務器控件,我們稍後可以在OnItemDataBound方法中引用它。

<asp:Repeater ID="repeaterResults" runat="server" OnItemDataBound="repeaterResult_ItemDataDataBound"> 
    <ItemTemplate> 
    <strong><%#Eval("Name") %></strong> 
    <asp:Literal runat="server" ID="ltlOption" /> 
    <br /> 
    </ItemTemplate></asp:Repeater> 

而且讓我們假設,我們將結合所具有兩個屬性的簡單對象的集合:名稱和選項類似如下:

public class SimpleEntity 
{ 
    public string Name {get;set;} 
    public string Option {get;set;} 
} 

下一步,我們將實現repeaterResult_ItemDataDataBound方法如下:

protected void repeaterResult_ItemDataDataBound(object sender, RepeaterItemEventArgs e) 
{ 
    SimpleEntity ent = e.Item.DataItem as SimpleEntity; 
    Literal ltlOption = e.Item.FindControl("ltlOption") as Literal; 
    if (ent != null && ltlOption != null) 
    { 
    if (!string.IsNullOrEmpty(ent.Option)) 
    { 
     ltlOption.Text = ent.Option; 
    } 
    else 
    { 
     ltlOption.Text = "Not entered!"; 
    } 

    } 
} 

由於上述方法已實現,因此如果存在,我們將顯示可選字段,而如果可選字段爲空或空字符串,則將顯示預定義d字符串「未進入!」。

8

我建議將每個鍵/值對封裝到具有2個屬性的自定義控件中。該控件將顯示本身僅當值不爲空:

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="ShowPair.ascx.cs" Inherits="MyWA.ShowPair" %> 

<% if (!string.IsNullOrEmpty(Value)) 
    { %> 
<%=Key %> : <%=Value %> 
<% } %> 

然後把控制進入轉發模板:

<asp:Repeater runat='server' ID="repeater1"> 
    <ItemTemplate> 
     <cst:ShowPair Key="Company Name:" Value="<%#((Company)Container.DataItem).CompanyName %>" runat="server"/> 
     <cst:ShowPair Key="Contact Name:" Value="<%#((Company)Container.DataItem).ContactName %>" runat="server" /> 
     <cst:ShowPair Key="Address 1:" Value="<%#((Company)Container.DataItem).Address1 %>" runat="server" /> 
    </ItemTemplate> 
    </asp:Repeater> 
0

我意識到,這是一個非常古老的問題,但我想補充說,也許處理這個問題的最好方法是在數據庫級別,而且是的 - 我知道OP沒有指定任何類型的數據源。

我只是假設(是的 - 你和我的屁股)所用的當前語言至少是Transact SQL。

爲此,我傾向於使用數據源來生成複合字段。在地址爲ISNULL的情況下,將愉快地測試以查看哪些字段正在使用,並且如果遇到空字段則返回默認值。最重要的是,可以包含分隔符以允許在目標輸出介質中換行。一種選擇是使用逗號+一個空格作爲分隔符', '

SELECT 
    ISNULL(src.address1 + ', ', '') + 
    ISNULL(src.address2 + ', ', '') + 
    ISNULL(src.address3 + ', ', '') + 
    ISNULL(src.address4 + ', ', '') + 
    ISNULL(src.postalcode, '') AS CompoundAddress 
... 

這是通過使用NULL對本身 - 增加NULL返回NULL,因此返回的值要麼包含我們逗號+空格,否則將返回一個空字符串。

類似的東西可以做到「絕招」微軟訪問到你的生產地址欄...

SELECT 
    (src.address1 + ', ') & 
    (src.address2 + ', ') & 
    (src.address3 + ', ') & 
    (src.address4 + ', ') & 
    (src.postalcode) As CompoundAddress 
... 

在這種情況下,符號將NULL轉換爲空字符串,但同樣還適用於將該字符串添加到可能的NULL字段中。

所以,現在,我們可以適當輸出我們的地址在HTML ...

<div id="results"> 
    <asp:Repeater ID="repeaterResults" runat="server"> 
     <ItemTemplate> 
      Company:  <strong><%#Eval("CompanyName") %></strong><br /> 
      Contact Name: <strong><%#Eval("ContactName") %></strong><br /> 
      Address:  <strong><%#Eval("CompoundAddress").ToString().Replace(", ", "<br />") %></strong><br />