【问题标题】:Rendering line breaks in HTML from SQL datasource从 SQL 数据源呈现 HTML 中的换行符
【发布时间】:2014-02-06 20:19:50
【问题描述】:

我将一列的多行作为一行和一列返回:

SELECT STUFF((
                SELECT '<br/>' + Notes 
                FROM DailyTaskHours
                WHERE Notes IS NOT NULL
                    AND Notes <> ''
                    AND NonScrumStoryId = DTH.NonScrumStoryId
                FOR XML PATH('')
                ), 1, 1, '')
                )

我想在 ASP.NET 中连接的每一行之间插入换行符,但我的方法不起作用:

如您所见,
正在被数据库引擎替换为 &amp;lt;br /&amp;gt; 如何获取数据库中的换行符,以便在网页上间隔呈现?

这是我正在处理的整个控件以供参考:

        <asp:GridView CssClass="hoursGrid" ID="hoursReportGridView" runat="server" AutoGenerateColumns="False" BackColor="#DEBA84" BorderColor="#DEBA84"
            BorderStyle="None" BorderWidth="1px" CellPadding="3" CellSpacing="2" DataSourceID="SqlDataSource2" OnRowDataBound="hoursReportGridView_OnRowDataBound" DataKeyNames="DifferentUsers, DoubleBookedFlag, PointPerson, Person">
            <Columns>
                <asp:BoundField DataField="Person" HeaderText="Person" SortExpression="Project" />
                <asp:BoundField DataField="Project" HeaderText="Project" SortExpression="Project" />
                <asp:BoundField DataField="ProjectType" HeaderText="Project Type" ReadOnly="True" SortExpression="Sprint" ItemStyle-HorizontalAlign="Center" />
                <asp:BoundField DataField="Theme" HeaderText="Theme" ReadOnly="True" SortExpression="Theme" ItemStyle-HorizontalAlign="Center" />
                <asp:BoundField DataField="StoryNumber" HeaderText="Story Number" SortExpression="Story" ItemStyle-Width="6%" ItemStyle-HorizontalAlign="Center" />
                <asp:BoundField DataField="StoryTitle" HeaderText="Story Title" SortExpression="Story" ItemStyle-Width="20%" />
                <asp:BoundField DataField="Effort" HeaderText="Effort" SortExpression="Effort" ItemStyle-HorizontalAlign="Right" />
                <asp:BoundField DataField="Task" HeaderText="Task" SortExpression="Task"  ItemStyle-Width="20%" />
                <asp:BoundField DataField="OriginalEstimateHours" HeaderText="Original Estimate" SortExpression="OriginalEstimateHours" ItemStyle-HorizontalAlign="Right" />
                <asp:BoundField DataField="Monday" HeaderText="Mon" ReadOnly="True" SortExpression="Monday" ItemStyle-HorizontalAlign="Right" />
                <asp:BoundField DataField="Tuesday" HeaderText="Tues" ReadOnly="True" SortExpression="Tuesday" ItemStyle-HorizontalAlign="Right" />
                <asp:BoundField DataField="Wednesday" HeaderText="Wed" ReadOnly="True" SortExpression="Wednesday" ItemStyle-HorizontalAlign="Right" />
                <asp:BoundField DataField="Thursday" HeaderText="Thurs" ReadOnly="True" SortExpression="Thursday" ItemStyle-HorizontalAlign="Right" />
                <asp:BoundField DataField="Friday" HeaderText="Fri" ReadOnly="True" SortExpression="Friday" ItemStyle-HorizontalAlign="Right" />
                <asp:BoundField DataField="Saturday" HeaderText="Sat" ReadOnly="True" SortExpression="Saturday" ItemStyle-HorizontalAlign="Right" />
                <asp:BoundField DataField="Sunday" HeaderText="Sun" ReadOnly="True" SortExpression="Sunday" ItemStyle-HorizontalAlign="Right" />
                <asp:TemplateField HeaderText="Total" ItemStyle-HorizontalAlign="Right">
                <ItemTemplate>
                     <asp:LinkButton ID="taskLinkButton" Text='<%# Eval("Total") %>' Enabled='<%# Eval("StoryTitle").ToString() != "" %>' runat="server" OnClick="taskLinkButton_Click" />
                </ItemTemplate>
                </asp:TemplateField>
            </Columns>
            <FooterStyle BackColor="#F7DFB5" ForeColor="#8C4510" />
            <HeaderStyle BackColor="#A55129" Font-Bold="True" ForeColor="White" />
            <PagerStyle ForeColor="#8C4510" HorizontalAlign="Center" />
            <RowStyle BackColor="#FFF7E7" ForeColor="#8C4510" />
            <SelectedRowStyle BackColor="#738A9C" Font-Bold="True" ForeColor="White" />
            <SortedAscendingCellStyle BackColor="#FFF1D4" />
            <SortedAscendingHeaderStyle BackColor="#B95C30" />
            <SortedDescendingCellStyle BackColor="#F1E5CE" />
            <SortedDescendingHeaderStyle BackColor="#93451F" />
        </asp:GridView>
        <asp:SqlDataSource ID="SqlDataSource2" runat="server" ConnectionString="<%$ ConnectionStrings:ApplicationServices %>" 
            SelectCommand="
SELECT RowType AS RowType
    ,Person AS Person
    ,Project AS Project
    ,ProjectType AS ProjectType
    ,Theme AS Theme
    ,StoryNumber AS StoryNumber
    ,StoryTitle AS StoryTitle
    ,Effort AS Effort
    ,Task AS Task
    ,OriginalEstimateHours AS OriginalEstimateHours
    ,MondayHours AS Monday
    ,TuesdayHours AS Tuesday
    ,WednesdayHours AS Wednesday
    ,ThursdayHours AS Thursday
    ,FridayHours AS Friday
    ,SaturdayHours AS Saturday
    ,SundayHours AS Sunday
    ,TotalHours AS Total
    ,DifferentUsers AS DifferentUsers
    ,DoubleBookedFlag AS DoubleBookedFlag
    ,PointPerson AS PointPerson
FROM (
    -- DATE DISPLAY
    SELECT '1' AS RowType
        ,'' AS Person
        ,'' AS Project
        ,'Category' AS ProjectType
        ,'' AS Theme
        ,'Ticket #' AS StoryNumber
        ,'' AS StoryTitle
        ,'' AS Effort
        ,'' AS Task
        ,'' AS OriginalEstimateHours
        ,'' AS Category
        ,'' AS IncidentNumber
        ,'' AS ApplicationName
        ,(
            CASE 
                WHEN DATEDIFF(d, @startDateParam, @endDateParam) >= 7
                    THEN ''
                WHEN DATEDIFF(d, @startDateParam, @endDateParam) <= 5
                    THEN ''
                WHEN DATEPART(dw, DATEADD(DAY, 0, @startDateParam)) = 2
                    THEN CONVERT(VARCHAR(5), DATEADD(DAY, 0, @startDateParam), 101)
                ELSE ''
                END
            ) AS MondayHours
        ,(
            CASE 
                WHEN DATEDIFF(d, @startDateParam, @endDateParam) >= 7
                    THEN ''
                WHEN DATEDIFF(d, @startDateParam, @endDateParam) <= 5
                    THEN ''
                WHEN DATEPART(dw, DATEADD(DAY, 1, @startDateParam)) = 3
                    THEN CONVERT(VARCHAR(5), DATEADD(DAY, 1, @startDateParam), 101)
                ELSE ''
                END
            ) AS TuesdayHours
        ,(
            CASE 
                WHEN DATEDIFF(d, @startDateParam, @endDateParam) >= 7
                    THEN ''
                WHEN DATEDIFF(d, @startDateParam, @endDateParam) <= 5
                    THEN ''
                WHEN DATEPART(dw, DATEADD(DAY, 2, @startDateParam)) = 4
                    THEN CONVERT(VARCHAR(5), DATEADD(DAY, 2, @startDateParam), 101)
                ELSE ''
                END
            ) AS WednesdayHours
        ,(
            CASE 
                WHEN DATEDIFF(d, @startDateParam, @endDateParam) >= 7
                    THEN ''
                WHEN DATEDIFF(d, @startDateParam, @endDateParam) <= 5
                    THEN ''
                WHEN DATEPART(dw, DATEADD(DAY, 3, @startDateParam)) = 5
                    THEN CONVERT(VARCHAR(5), DATEADD(DAY, 3, @startDateParam), 101)
                ELSE ''
                END
            ) AS ThursdayHours
        ,(
            CASE 
                WHEN DATEDIFF(d, @startDateParam, @endDateParam) >= 7
                    THEN ''
                WHEN DATEDIFF(d, @startDateParam, @endDateParam) <= 5
                    THEN ''
                WHEN DATEPART(dw, DATEADD(DAY, 4, @startDateParam)) = 6
                    THEN CONVERT(VARCHAR(5), DATEADD(DAY, 4, @startDateParam), 101)
                ELSE ''
                END
            ) AS FridayHours
        ,(
            CASE 
                WHEN DATEDIFF(d, @startDateParam, @endDateParam) >= 7
                    THEN ''
                WHEN DATEDIFF(d, @startDateParam, @endDateParam) <= 5
                    THEN ''
                WHEN DATEPART(dw, DATEADD(DAY, 5, @startDateParam)) = 7
                    THEN CONVERT(VARCHAR(5), DATEADD(DAY, 5, @startDateParam), 101)
                ELSE ''
                END
            ) AS SaturdayHours
        ,(
            CASE 
                WHEN DATEDIFF(d, @startDateParam, @endDateParam) >= 7
                    THEN ''
                WHEN DATEDIFF(d, @startDateParam, @endDateParam) <= 5
                    THEN ''
                WHEN DATEPART(dw, DATEADD(DAY, 6, @startDateParam)) = 1
                    THEN CONVERT(VARCHAR(5), DATEADD(DAY, 6, @startDateParam), 101)
                ELSE ''
                END
            ) AS SundayHours
        ,'' AS TotalHours
        ,'' AS DifferentUsers
        ,'' AS DoubleBookedFlag
        ,'' AS PointPerson
    --

    UNION ALL

    --
    -- GRAND TOTALS
    --
    SELECT '2' AS RowType
        ,'All Personnel' AS Person
        ,'' AS Project
        ,'' AS ProjectType
        ,'' AS Theme
        ,'' AS StoryNumber
        ,'' AS StoryTitle
        ,'' AS Effort
        ,'Total:' AS Task
        ,'' AS OriginalEstimateHours
        ,'' AS Category
        ,'' AS IncidentNumber
        ,'' AS ApplicationName
        ,CAST(SUM(CASE 
                    WHEN DATEPART(dw, DTH.ActivityDate) = 2
                        THEN DTH.[Hours]
                    ELSE 0
                    END) AS VARCHAR(20)) AS Monday
        ,CAST(SUM(CASE 
                    WHEN DATEPART(dw, DTH.ActivityDate) = 3
                        THEN DTH.[Hours]
                    ELSE 0
                    END) AS VARCHAR(20)) AS Tuesday
        ,CAST(SUM(CASE 
                    WHEN DATEPART(dw, DTH.ActivityDate) = 4
                        THEN DTH.[Hours]
                    ELSE 0
                    END) AS VARCHAR(20)) AS Wednesday
        ,CAST(SUM(CASE 
                    WHEN DATEPART(dw, DTH.ActivityDate) = 5
                        THEN DTH.[Hours]
                    ELSE 0
                    END) AS VARCHAR(20)) AS Thursday
        ,CAST(SUM(CASE 
                    WHEN DATEPART(dw, DTH.ActivityDate) = 6
                        THEN DTH.[Hours]
                    ELSE 0
                    END) AS VARCHAR(20)) AS Friday
        ,CAST(SUM(CASE 
                    WHEN DATEPART(dw, DTH.ActivityDate) = 7
                        THEN DTH.[Hours]
                    ELSE 0
                    END) AS VARCHAR(20)) AS Saturday
        ,CAST(SUM(CASE 
                    WHEN DATEPART(dw, DTH.ActivityDate) = 1
                        THEN DTH.[Hours]
                    ELSE 0
                    END) AS VARCHAR(20)) AS Sunday
        ,CAST(SUM(DTH.[Hours]) AS VARCHAR(20)) AS Total
        ,'' AS DifferentUsers
        ,'' AS DoubleBookedFlag
        ,'' AS PointPerson
    FROM DailyTaskHours DTH
    LEFT JOIN NonScrumStory NSS ON DTH.NonScrumStoryId = NSS.PK_NonScrumStory
    LEFT JOIN Task TSK ON DTH.TaskId = TSK.PK_Task
    LEFT JOIN Story STY ON TSK.StoryId = STY.PK_Story
    LEFT JOIN Product PDT ON STY.ProductId = PDT.PK_Product
    LEFT JOIN [User] USR ON DTH.EnteredBy = USR.DisplayName
    WHERE DTH.EnteredBy LIKE @userParam
        AND ActivityDate >= @startDateParam
        AND ActivityDate <= @endDateParam
        AND 1 = CASE ISNUMERIC(@productId)
            WHEN 0
                THEN CASE 
                        WHEN DTH.TaskId IS NULL
                            OR PDT.PK_Product LIKE @productId
                            THEN 1
                        END
            WHEN 1
                THEN CASE 
                        WHEN DTH.TaskId IS NOT NULL
                            AND PDT.PK_Product = @productId
                            THEN 1
                        END
            END
        AND (
            (
                @orgTeamPK = '%'
                AND (
                    USR.[OrganizationalTeamId] LIKE @orgTeamPK
                    OR USR.[OrganizationalTeamId] IS NULL
                    )
                )
            OR (
                @orgTeamPK <> '%'
                AND (USR.[OrganizationalTeamId] LIKE @orgTeamPK)
                )
            )
        AND (
            (
                STY.Number LIKE @search
                OR STY.Number IS NULL
                )
            OR (
                STY.Title LIKE @search
                OR STY.Title IS NULL
                )
            OR (
                TSK.NAME LIKE @search
                OR TSK.NAME IS NULL
                )
            )
        AND (
            (
                @theme = '%'
                AND (
                    dbo.primaryTheme(STY.[Number]) LIKE @theme
                    OR dbo.primaryTheme(STY.[Number]) IS NULL
                    )
                )
            OR (
                @theme != '%'
                AND dbo.primaryTheme(STY.[Number]) = @theme
                )
            )

    UNION ALL

    --
    -- Details by PERSON, PROJECT, SPRINT, STORY, TASK
    --
    SELECT '3' AS RowType
        ,DTH.EnteredBy AS Person
        ,COALESCE(PDT.[Name], APP.AppName) AS Project
        ,(
            CASE 
                WHEN (
                        STY.KanBanProductId IS NOT NULL
                        AND STY.SprintId IS NULL
                        )
                    THEN 'Kanban'
                WHEN (
                        STY.KanBanProductId IS NULL
                        AND STY.SprintId IS NOT NULL
                        )
                    THEN 'Sprint'
                ELSE SCY.Catagory
                END
            ) AS ProjectType
        ,dbo.primaryTheme(STY.[Number]) AS Theme
        ,COALESCE(STY.[Number], NSS.IncidentNumber) AS StoryNumber
        ,COALESCE(STY.Title, NSS.[Description]) AS StoryTitle
        ,CONVERT(VARCHAR(20), STY.Effort) AS Effort
        ,COALESCE(TSK.[Name], (
                SELECT STUFF((
                            SELECT ' | ' + Notes 
                            FROM DailyTaskHours
                            WHERE Notes IS NOT NULL
                                AND Notes <> ''
                                AND NonScrumStoryId = DTH.NonScrumStoryId
                            FOR XML PATH('')
                            ), 1, 1, '')
                )) AS Task
        ,CONVERT(VARCHAR(20), TSK.OriginalEstimateHours) AS OriginalEstimateHours
        ,SCY.Catagory AS Category
        ,NSS.IncidentNumber AS IncidentNumber
        ,APP.AppName AS ApplicationName
        ,CAST(SUM(CASE 
                    WHEN DATEPART(dw, DTH.ActivityDate) = 2
                        THEN DTH.[Hours]
                    ELSE 0
                    END) AS VARCHAR(20)) AS MondayHours
        ,CAST(SUM(CASE 
                    WHEN DATEPART(dw, DTH.ActivityDate) = 3
                        THEN DTH.[Hours]
                    ELSE 0
                    END) AS VARCHAR(20)) AS TuesdayHours
        ,CAST(SUM(CASE 
                    WHEN DATEPART(dw, DTH.ActivityDate) = 4
                        THEN DTH.[Hours]
                    ELSE 0
                    END) AS VARCHAR(20)) AS WednesdayHours
        ,CAST(SUM(CASE 
                    WHEN DATEPART(dw, DTH.ActivityDate) = 5
                        THEN DTH.[Hours]
                    ELSE 0
                    END) AS VARCHAR(20)) AS ThursdayHours
        ,CAST(SUM(CASE 
                    WHEN DATEPART(dw, DTH.ActivityDate) = 6
                        THEN DTH.[Hours]
                    ELSE 0
                    END) AS VARCHAR(20)) AS FridayHours
        ,CAST(SUM(CASE 
                    WHEN DATEPART(dw, DTH.ActivityDate) = 7
                        THEN DTH.[Hours]
                    ELSE 0
                    END) AS VARCHAR(20)) AS SaturdayHours
        ,CAST(SUM(CASE 
                    WHEN DATEPART(dw, DTH.ActivityDate) = 1
                        THEN DTH.[Hours]
                    ELSE 0
                    END) AS VARCHAR(20)) AS SundayHours
        ,CAST(SUM(DTH.[Hours]) AS VARCHAR(20)) AS TotalHours
        ,CAST(SUM(CASE 
                    WHEN DTH.Hours > 0
                        THEN DTH.[UserDifference]
                    END) AS VARCHAR(20)) AS DifferentUsers
        ,CAST(SUM(CASE 
                    WHEN DTH.Hours > 0
                        THEN DTH.DoubleBookedFlag
                    END) AS VARCHAR(20)) AS DoubleBookedFlag
        ,DTH.PointPerson AS PointPerson
    FROM DailyTaskHours DTH
    LEFT JOIN Task TSK ON DTH.TaskId = TSK.PK_Task
    LEFT JOIN Story STY ON TSK.StoryId = STY.PK_Story
    LEFT JOIN NonScrumStory NSS ON DTH.NonScrumStoryId = NSS.PK_NonScrumStory
    LEFT JOIN SupportCatagory SCY ON NSS.CatagoryId = SCY.PK_SupportCatagory
    LEFT JOIN [Application] APP ON NSS.ApplicationId = APP.PK_Application
    LEFT JOIN Sprint SPT ON STY.SprintId = SPT.PK_Sprint
    LEFT JOIN Product PDT ON STY.ProductId = PDT.PK_Product
    LEFT JOIN [User] USR ON DTH.EnteredBy = USR.DisplayName
    WHERE DTH.EnteredBy LIKE @userParam
        AND ActivityDate >= @startDateParam
        AND ActivityDate <= @endDateParam
        AND 1 = CASE ISNUMERIC(@productId)
            WHEN 0
                THEN CASE 
                        WHEN DTH.TaskId IS NULL
                            OR PDT.PK_Product LIKE @productId
                            THEN 1
                        END
            WHEN 1
                THEN CASE 
                        WHEN DTH.TaskId IS NOT NULL
                            AND PDT.PK_Product = @productId
                            THEN 1
                        END
            END
        AND (
            (
                @orgTeamPK = '%'
                AND (
                    USR.[OrganizationalTeamId] LIKE @orgTeamPK
                    OR USR.[OrganizationalTeamId] IS NULL
                    )
                )
            OR (
                @orgTeamPK <> '%'
                AND (USR.[OrganizationalTeamId] LIKE @orgTeamPK)
                )
            )
        AND (
            (
                STY.Number LIKE @search
                OR STY.Number IS NULL
                )
            OR (
                STY.Title LIKE @search
                OR STY.Title IS NULL
                )
            OR (
                TSK.NAME LIKE @search
                OR TSK.NAME IS NULL
                )
            )
        AND (
            (
                @theme = '%'
                AND (
                    dbo.primaryTheme(STY.[Number]) LIKE @theme
                    OR dbo.primaryTheme(STY.[Number]) IS NULL
                    )
                )
            OR (
                @theme != '%'
                AND dbo.primaryTheme(STY.[Number]) = @theme
                )
            )
    GROUP BY DTH.EnteredBy
        ,PDT.[Name]
        ,SPT.[Name]
        ,SPT.[Description]
        ,STY.[Number]
        ,STY.Title
        ,TSK.[Name]
        ,SCY.Catagory
        ,NSS.IncidentNumber
        ,APP.AppName
        ,STY.KanBanProductId
        ,STY.SprintId
        ,NSS.[Description]
        ,TSK.OriginalEstimateHours
        ,STY.Effort
        ,DTH.PointPerson
        ,DTH.NonScrumStoryId
    HAVING SUM(DTH.[Hours]) > 0
    --

    UNION ALL

    --
    -- Sub-TOTAL by PERSON
    --
    SELECT '4' AS RowType
        ,DTH.EnteredBy AS Person
        ,'' AS Project
        ,'' AS ProjectType
        ,'' AS Theme
        ,'' AS StoryNumber
        ,'' AS StoryTitle
        ,'' AS Effort
        ,'Subtotal:' AS Task
        ,'' AS OriginalEstimateHours
        ,'' AS Category
        ,'' AS IncidentNumber
        ,'' AS ApplicationName
        ,CAST(SUM(CASE 
                    WHEN DATEPART(dw, DTH.ActivityDate) = 2
                        THEN DTH.[Hours]
                    ELSE 0
                    END) AS VARCHAR(20)) AS MondayHours
        ,CAST(SUM(CASE 
                    WHEN DATEPART(dw, DTH.ActivityDate) = 3
                        THEN DTH.[Hours]
                    ELSE 0
                    END) AS VARCHAR(20)) AS TuesdayHours
        ,CAST(SUM(CASE 
                    WHEN DATEPART(dw, DTH.ActivityDate) = 4
                        THEN DTH.[Hours]
                    ELSE 0
                    END) AS VARCHAR(20)) AS WednesdayHours
        ,CAST(SUM(CASE 
                    WHEN DATEPART(dw, DTH.ActivityDate) = 5
                        THEN DTH.[Hours]
                    ELSE 0
                    END) AS VARCHAR(20)) AS ThursdayHours
        ,CAST(SUM(CASE 
                    WHEN DATEPART(dw, DTH.ActivityDate) = 6
                        THEN DTH.[Hours]
                    ELSE 0
                    END) AS VARCHAR(20)) AS FridayHours
        ,CAST(SUM(CASE 
                    WHEN DATEPART(dw, DTH.ActivityDate) = 7
                        THEN DTH.[Hours]
                    ELSE 0
                    END) AS VARCHAR(20)) AS SaturdayHours
        ,CAST(SUM(CASE 
                    WHEN DATEPART(dw, DTH.ActivityDate) = 1
                        THEN DTH.[Hours]
                    ELSE 0
                    END) AS VARCHAR(20)) AS SundayHours
        ,CAST(SUM(DTH.[Hours]) AS VARCHAR(20)) AS TotalHours
        ,'' AS DifferentUsers
        ,'' AS DoubleBookedFlag
        ,'' AS PointPerson
    FROM DailyTaskHours DTH
    LEFT JOIN Task TSK ON DTH.TaskId = TSK.PK_Task
    LEFT JOIN Story STY ON TSK.StoryId = STY.PK_Story
    LEFT JOIN Product PDT ON STY.ProductId = PDT.PK_Product
    LEFT JOIN [User] USR ON DTH.EnteredBy = USR.DisplayName
    WHERE DTH.EnteredBy LIKE @userParam
        AND ActivityDate >= @startDateParam
        AND ActivityDate <= @endDateParam
        AND 1 = CASE ISNUMERIC(@productId)
            WHEN 0
                THEN CASE 
                        WHEN DTH.TaskId IS NULL
                            OR PDT.PK_Product LIKE @productId
                            THEN 1
                        END
            WHEN 1
                THEN CASE 
                        WHEN DTH.TaskId IS NOT NULL
                            AND PDT.PK_Product = @productId
                            THEN 1
                        END
            END
        AND (
            (
                @orgTeamPK = '%'
                AND (
                    USR.[OrganizationalTeamId] LIKE @orgTeamPK
                    OR USR.[OrganizationalTeamId] IS NULL
                    )
                )
            OR (
                @orgTeamPK <> '%'
                AND (USR.[OrganizationalTeamId] LIKE @orgTeamPK)
                )
            )
        AND (
            (
                STY.Number LIKE @search
                OR STY.Number IS NULL
                )
            OR (
                STY.Title LIKE @search
                OR STY.Title IS NULL
                )
            OR (
                TSK.NAME LIKE @search
                OR TSK.NAME IS NULL
                )
            )
        AND (
            (
                @theme = '%'
                AND (
                    dbo.primaryTheme(STY.[Number]) LIKE @theme
                    OR dbo.primaryTheme(STY.[Number]) IS NULL
                    )
                )
            OR (
                @theme != '%'
                AND dbo.primaryTheme(STY.[Number]) = @theme
                )
            )
    GROUP BY DTH.EnteredBy
    HAVING SUM(DTH.[Hours]) > 0
    ) AS My_View
ORDER BY Person
    ,RowType
    ,Project
    ,ProjectType
    ,StoryNumber
    ,StoryTitle
    ,Task
            ">
            <SelectParameters>
                <asp:QueryStringParameter Name="userParam" Type="String" DefaultValue="%" />
                <asp:QueryStringParameter Name="startDateParam" Type="String" />
                <asp:QueryStringParameter Name="endDateParam" Type="String" />
                <asp:QueryStringParameter Name="orgTeamPK" Type="String" DefaultValue="%" />
                <asp:QueryStringParameter Name="productId" Type="String" DefaultValue="%" />
                <asp:QueryStringParameter Name="search" Type="String" DefaultValue="%" />
                <asp:QueryStringParameter Name="theme" Type="String" />
            </SelectParameters>
        </asp:SqlDataSource>

【问题讨论】:

  • 不要将&lt;br&gt; 连接到SQL 查询中,而是使用数组,您可以稍后对其进行映射。

标签: asp.net sql sql-server datasource


【解决方案1】:

您的数据库引擎没有这样做,ASP.NET 正在这样做。这是一项有助于防止 XSS 的安全功能。

您可以在绑定字段上设置 HtmlEncode 属性,如MSDN 链接中的示例:

<asp:boundfield datafield="City"
            htmlencode="false"
            headertext="City"/>

【讨论】:

  • 我不知道这个功能。它肯定回答了具体问题。不错。
【解决方案2】:

在您的应用程序中,您可能希望对字符串执行HttpUtility.HtmlDecode

来自 MSDN:

将已为 HTTP 传输进行 HTML 编码的字符串转换为已解码的字符串。

http://msdn.microsoft.com/en-us/library/system.web.httputility.htmldecode(v=vs.110).aspx

事实上,最好将&lt;br /&gt; 附加在应用程序本身中,而不是在查询中。在查询本身以这种方式处理数据并不典型。通常,为您的应用程序获取的数据不应附加任何表示层或视图类型的东西,除非这正是它在数据库中的存在方式。为您的应用程序保存该工作。例如,如果这是一个 MVC 应用程序,您可以考虑在控制器中进行此类工作。

更多...

现在我从您刚刚发布的代码中看到了您问题的完整上下文,我将在下面为任何未来的读者添加我在此答案中所做的相同评论。自从我进入 ASP.NET WebForms 领域以来已经有一段时间了,所以我可能有点生疏了!我的评论...

有更好的方法来处理这个问题,但我担心它可能超出了这个问题的范围,因为它还涉及您如何创建数据源。如果您有兴趣,可以快速搜索 in this example 中的 Repeater,在 GridView 和具有两个相关数据表的数据源中。这是一个旧示例 (.NET 2.0),但它可能仍然有效,或者至少可以帮助您找到更好的示例。

现在需要一个替代答案吗? ...

我可以想到针对您的问题的另一种选择。在查询中,您可以附加一个简单的新行(\n 或 SQL 中的 char(10)),而不是附加 &lt;br /&gt;。然后,不要在GridView 中为该字段使用asp:BoundColumn,而是使用asp:TemplateField 并在模板内部,将\n 替换为&lt;br /&gt;。就像我之前说的,我已经有一段时间没有做 WebForms 了,但我相信它看起来像:

<%#Eval("Task").Replace("\n", "<br />")%>

我想您可以使用HtmlDecode 进行类似操作,但我不喜欢在这些查询结果中看到 HTML 标记。

【讨论】:

  • 谢谢,但是 SQL 在 ASPX 端...我尝试将选择行更改为: SELECT + 注意但是遇到语法错误。
  • HttpUtility.HtmlEncode 是一种 .NET 方法,因此在 SQL 中不起作用。您可以在代码中附加&lt;br /&gt; 吗?这是执行此操作的首选方式,因为您处理的数据与数据库本身中存在的数据完全相同。
  • 对,我在 C# 服务器标签中嵌入了 HttpUtility.HtmlEncode,因为它是一个 .NET ASPX 页面。当我以这种方式使用查询时,如何在代码中附加
  • 你在这里使用什么控件?如果您使用的是 ASP.NET Repeater,则可以选择添加 &lt;SeparatorTemplate&gt;,并且可以将 &lt;br /&gt; 放入其中。
  • 好的,这说明了一切。有更好的方法来处理这个问题,但我担心它可能超出了这个问题的范围,因为它还会涉及您如何创建数据源。如果您有兴趣,快速搜索会在GridView 内找到this exampleRepeater 和具有两个相关数据表的数据源。这是一个旧示例(.NET 2.0),但它可能仍然有效,或者至少可以帮助您找到更好的示例。
【解决方案3】:
SELECT REPLACE((SELECT '<br/>' + Notes 
               FROM DailyTaskHours
               WHERE Notes IS NOT NULL
                 AND Notes <> ''
                 AND NonScrumStoryId = DTH.NonScrumStoryId
            FOR XML PATH('')) ,'&lt;br/&gt;','<br/>')

【讨论】:

    【解决方案4】:

    亲爱的使用以下

    SELECT STUFF((
                SELECT '<br/>' + Notes 
                FROM DailyTaskHours
                WHERE Notes IS NOT NULL
                    AND Notes <> ''
                    AND NonScrumStoryId = DTH.NonScrumStoryId
                FOR XML PATH(''),TYPE).value('.','NVARCHAR(MAX)')
                ), 1, 1, '')
                )
    

      SELECT STUFF((
                SELECT '<br/>' + Notes 
                FROM DailyTaskHours
                WHERE Notes IS NOT NULL
                    AND Notes <> ''
                    AND NonScrumStoryId = DTH.NonScrumStoryId
                FOR XML PATH(''),TYPE).value('(./text())[1]','NVARCHAR(MAX)')
                ), 1, 1, '')
                )
    

    【讨论】:

      【解决方案5】:

      测试数据

      DECLARE @DailyTaskHours TABLE (NonScrumStoryId INT, Notes NVARCHAR(100))
      INSERT INTO @DailyTaskHours VALUES
      (1, 'Note one for value one'),(1, 'Note two for value one'),(1, 'Note three for value one'),
      (2, 'Note one for value Two'),(2, 'Note Two for value Two'),(2, 'Note Three for value two')
      

      查询

      SELECT STUFF((SELECT '<br/>' + Notes 
                      FROM @DailyTaskHours
                      WHERE Notes IS NOT NULL
                      AND Notes <> ''
                      AND NonScrumStoryId = DTH.NonScrumStoryId
                      FOR XML PATH(''), TYPE)
                     .value('.','NVARCHAR(MAX)'), 1, 5, '') AS NotesList
      FROM @DailyTaskHours DTH
      GROUP BY NonScrumStoryId
      

      结果集

      ╔════════════════════════════════════════════════════════════════════════════════╗
      ║                                   NotesList                                    ║
      ╠════════════════════════════════════════════════════════════════════════════════╣
      ║ Note one for value one<br/>Note two for value one<br/>Note three for value one ║
      ║ Note one for value Two<br/>Note Two for value Two<br/>Note Three for value two ║
      ╚════════════════════════════════════════════════════════════════════════════════╝
      

      使用交叉应用

      SELECT DISTINCT STUFF(REPLACE(C.NotesList,'Break_Tag', '<br/>') , 1, 5, '') AS NotesList
      FROM @DailyTaskHours DTH CROSS APPLY 
                               (SELECT 'Break_Tag' + Notes  [text()]
                                FROM @DailyTaskHours
                                WHERE Notes IS NOT NULL
                                AND Notes <> ''
                                AND NonScrumStoryId = DTH.NonScrumStoryId
                                FOR XML PATH('')
                                )C(NotesList)
      

      【讨论】:

        猜你喜欢
        • 2015-11-18
        • 1970-01-01
        • 2012-09-23
        • 2010-10-19
        • 2012-01-28
        • 1970-01-01
        • 2010-11-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多