ASP.net页面中的条件逻辑

时间:2008-12-15 12:07:09

标签: c# asp.net conditional

我有一些代码将数据库值打印到asp.net页面上的转发器控件中。但是,返回的某些值为null / blank - 这会使得当有空格时结果看起来很难看。

如何在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 />..................

非常感谢

5 个答案:

答案 0 :(得分: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>

答案 1 :(得分:6)

这将是一个非常主观的,因为它完全取决于你想要处理空值/空值的位置和方式,以及你正在处理的那两个中的哪一个。

例如,有些人喜欢在数据库级别处理空值,有些人喜欢在业务逻辑层中编写默认值,而其他人喜欢在UI处理默认值/空白值 - 更不用说介于两者之间的多种选项了。

无论哪种方式,我个人的选择都是确保您在UI级别显示该字段没有可用数据以避免混淆。最糟糕的是:

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

这样至少用户知道没有数据可用,而不是不知道是否存在系统/管理错误。

希望有所帮助:)

答案 2 :(得分:3)

有很多方法可以做到这一点,我通常使用转发器的事件OnItemDataBound事件,该事件发生在转发器的项目绑定到数据项时。

为了解释OnItemDataBound事件,我们假设我们的转发器有一个始终显示的字段(Name)和显示的可选字段(如果不为null)(可选)。如果可选字段为null或为空,我们还希望显示一些预定义值。
要做到这一点,我们首先需要设置转发器的OnItemDataBound事件以指向方法,并且还要构建转发器的项目模板。我们可以在转发器的项模板中使用任何服务器控件,稍后我们可以在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>

进一步假设我们将绑定一组具有两个属性的简单对象:Name和Option,如下所示:

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!";
     }

  }
}

当实现上述方法时,如果存在,我们将显示可选字段,而如果可选字段为空或空字符串,我们将显示预定义字符串“未输入!”。

答案 3 :(得分:1)

您可以使用IsDBNull(obj)

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

答案 4 :(得分:0)

我意识到这是一个非常古老的问题,但我想补充一点,也许处理这个问题的最佳方式更多是在数据库层面,是的 - 我知道OP没有&#39; t指定了任何类型的数据源。

我只是假设(是的 - 你和我的屁股)当前使用的语言至少是Transact SQL。

为此,我倾向于使用数据源来生成复合字段。在地址ISNULL的情况下,将很乐意测试以查看正在使用的字段,并在遇到NULL字段时返回默认值。除此之外,可以包括分隔符以允许目标输出介质中的换行符。一种选择是使用逗号+一个空格作为分隔符', '

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

这可以通过NULL对自己使用 - 添加到NULL会返回NULL,因此返回的值将包含我们的逗号+空格,否则它将返回一个空字符串。< / p>

类似的东西可以用来欺骗&#39; Microsoft Access生成您的地址栏...

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 />