8

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

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

非常感谢

4

5 回答 5

9

我建议将每个键/值对包装到具有 2 个属性的自定义控件中。仅当 value 不为空时,此控件才会显示自身:

 <%@ 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>
于 2008-12-15T13:56:59.313 回答
6

这将是一个非常主观的问题,因为它完全取决于您喜欢在哪里以及如何处理空值/空白值,以及实际上您正在处理这两个值中的哪一个。

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

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

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

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

希望有帮助:)

于 2008-12-15T12:32:01.090 回答
3

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

为了解释 OnItemDataBound 事件,我们假设我们有一个中继器,其中一个始终显示的字段(名称)和一个在不为空时显示的可选字段(可选)。此外,如果可选字段为空或空,我们希望显示一些预定义的值。
为此,我们首先需要将转发器的 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!";
     }

  }
}

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

于 2008-12-15T12:38:19.453 回答
1

您可以使用 IsDBNull(obj)

If IsDbNull(<%#Eval("Address2")%>) then
     etc
End If
于 2008-12-15T12:36:18.803 回答
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返回 a 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 />
于 2018-02-20T14:29:55.653 回答