我有一些代码将数据库值打印到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 />..................
非常感谢
答案 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 />