如何让 WebGrid 仅在 item.Email 字段中有数据时才显示电子邮件 Link?

How Do I Get WebGrid To Display Email Link Only If There's Data In The item.Email Field?

我有一个 WebGrid,我试图通过仅在 SQL 查询的 ContactEmail 字段中有一些内容时才显示 mailto link 来美化它。如果 ContactEmail 字段中没有任何内容(即 NULL 或“”),我希望它什么都不显示。

当前版本有一个标准:

locationsGrid.Column("ContactEmail", "Email")

但这只是将该字段中的任何内容显示为文本。不太美观。

如果我去:

locationsGrid.Column("ContactEmail", "Email",  format: @<text><a href="mailto:@item.ContactEmail " target="_top">Email</a></text>)

我在每一行中都得到了文本 "Email",那些在电子邮件字段中有文本的文本得到了 link(如我所愿),而那些没有以纯文本形式得到的文本(我肯定不想)。

我试过:

locationsGrid.Column("ContactEmail", "Email",  format: (item.ContactEmail == null || item.ContactEmail == "" ? "" : @<text><a href="mailto:@item.ContactEmail " target="_top">Email</a></text>))

但我得到:

Compiler Error Message: CS0103: The name 'item' does not exist in the current context

有人可以帮我改正吗?

您是否尝试过在格式部分的 lambda 函数中明确使用 item

format: (item) => (String.IsNullOrEmpty(item.ContactEmail) ? "" : @<text><a href="mailto:@item.ContactEmail" target="_top">Email</a></text>)

或者,如果您更喜欢更详细的方法:

grid.Column(format: (item) =>
{
     if (!String.IsNullOrEmpty(item.ContactEmail))
     {
         return Html.Raw("<a href='mailto:@item.ContactEmail' target='_top'>Email</a>"));
     }
})

我认为您可能需要在 lambda 中设置 "item"。

locationsGrid.Column("ContactEmail", "Email",  format: item => (item.ContactEmail == null || item.ContactEmail == "" ? "" : @<text><a href="mailto:@item.ContactEmail " target="_top">Email</a></text>))

还可以使用 String.IsNullOrEmpty(item.ContactEmail) 而不是检查 null 然后使用空字符串可以帮助您的代码更简洁。

我已经找到了问题的解决方案,但采用了横向方法来解决问题。基本上,我没有在 WebGrid.Column 的 属性 格式中使用条件语句和 lamdba 函数,而是从源 SQL 查询中创建了 HTML。所以,虽然我最初的 SELECT 查询的相关片段说:

SELECT ContactEmail FROM Clients

它现在说:

SELECT CASE WHEN LEN(ContactEmail) < 1 THEN '' WHEN ContactEmail is null THEN '' ELSE ('<a href=mailto:' + ContactEmail + ' target=_top>email</a>') END AS EmailAddress FROM Clients

这正是我想要的输出到 WebGrid 的内容,除非我只是使用:

locationsGrid.Column("EmailAddress", "Email")

我的 SQL 标签输出中的大于号和小于号被转置为 entity_name 变体,我认为这是针对 SQL 注入的内置预防措施.

处理这个很简单 - 我只是用 Html.Raw 格式化输出,所以我的 WebGrid 现在显示:

locationsGrid.Column("EmailAddress", "Email", format: @<text> @Html.Raw(item.EmailAddress)</text> )