ASP.net页面中的条件逻辑

9
我有一些代码,将数据库中的值打印到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个回答

10

我建议将每个键/值对封装到具有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>

7
这可能是一个很主观的问题,因为如何处理空值/空白值完全取决于您喜欢在哪里和如何处理它们,以及您正在处理的是两者中的哪一个。
例如,有些人喜欢在数据库层处理空值,有些人喜欢在业务逻辑层编写默认值,而其他人则喜欢在UI层处理默认/空白值 - 更不用说其中的大量选项了。
无论如何,我的个人选择是确保在UI层显示该字段没有可用数据,以避免混淆。最差的情况是显示以下内容:
<strong><% If (Eval("Address2").Length > 0) Then %><%#Eval("Address2")%><% Else %>No data available for Address 2<% End If %></strong><br />

这样,至少用户知道没有可用的数据,而不是不知道是否出现了一些系统/管理错误。

希望这有所帮助 :)


3

有很多方法可以实现这个,我通常使用重复器的OnItemDataBound事件,该事件在将重复器项绑定到数据项时发生。

为了解释OnItemDataBound事件,让我们假设我们有一个带有一个始终显示的字段(Name)和一个可选字段(Optional),如果不为空则显示。此外,如果可选字段为空或空字符串,则我们想要显示一些预定义的值。
为此,我们需要先将重复器的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>

假设我们要绑定一个包含两个属性(名称和选项)的简单对象集合,代码如下:

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

  }
}

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


1
您可以使用IsDBNull(obj)。
If IsDbNull(<%#Eval("Address2")%>) then
     etc
End If

这是C#:虽然IsDbNull()可以通过microsoft.visualbasic命名空间使用。 - Joel Coehoorn

0

我知道这是一个非常老的问题,但我想补充一下,也许处理这个问题的最佳方式更多地涉及到数据库层面,是的 - 我知道OP没有指定任何类型的数据源。

我只是假设(是的 - 你和我都是傻瓜),当前使用的语言至少是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,因此返回的值将包含逗号和空格或者返回一个空字符串。

类似的方法也可以用来“欺骗”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 />

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接