C#Webforms - 如果符合条件,则在文本部分周围添加<strong>

时间:2015-11-19 15:40:19

标签: c# asp.net twitter-bootstrap webforms

我正在努力为C#Webforms(Bootstrap)网站添加简单的博客功能,并尝试在右侧列中创建网站存档。存档显示过去6个月的列表,无论是否在该月发布任何文章。每个月(列表中的项目)都附有徽章,其中显示的月份中发布的帖子数量。如果没有帖子,徽章将会崩溃(Bootstrap)。此外,当前选定的月份是粗体,这是我的问题所在。

我希望以有序的方式迭代过去6个月,计算给定月份的文章数量以及是否是所选月份。

以下是档案目前的样子(测试颜色:)):

Blog Archive

如您所见,9月已突出显示,因为它是由网址...BlogArchive?year=2015&month=September选择的月份。目前,这是我突出显示当月的代码:

<div class="list-group blog-archive">
    <% DateTime monthCounter = DateTime.Today.AddMonths(-6);
        for (int i = 0; i < 6; i++)
        {
            monthCounter = monthCounter.AddMonths(1);

            //Get the number of posts in the current month list-item
            string numberOfPostsInMonth = GetNumberOfPostsInMonth(monthCounter.ToString("MMMM"), monthCounter.ToString("yyyy"));
            string archiveURL = "";

            if (numberOfPostsInMonth != "")
            {
                //Get the URL to pass to the Blog Archive link 'href'
                archiveURL = "BlogArchive?year=" + monthCounter.ToString("yyyy") + "&month=" + monthCounter.ToString("MMMM");
            }
            else
            {
                archiveURL = "BlogArchive";
            }

            if (monthCounter.ToString("yyyy") == SelectedYear && monthCounter.ToString("MMMM") == SelectedMonth)
            {
                %>
                <a href="<%=archiveURL %>" class="list-group-item"><strong><%=monthCounter.ToString("MMMM yyyy") %></strong>
                    <span class="badge"><%=numberOfPostsInMonth %></span>
                </a>
                <%
            }
            else
            {
                %>
                <a href="<%=archiveURL %>" class="list-group-item"><%=monthCounter.ToString("MMMM yyyy") %>
                    <span class="badge"><%=numberOfPostsInMonth %></span>
                </a>
                <%
            }                       
    } %>
</div>

然而,这不太理想,因为我重复了两次相同的<a>标记语句 - 唯一的区别是应用了<strong>标记(和结束标记),另一个才不是。此外,我将添加功能,以便所有没有帖子的月份都不会包含链接(因为没有什么可看的 - &gt;即6月 - 8月)。目前,这将涉及在上述两个if语句中添加相同的<a>语句,这似乎也是毫无意义的重复,特别是如果我将来需要更改它。

有没有办法简化上述声明,以便我不重复相同的<a>声明?如果列表月份等于所选月份,我试图想办法只应用<strong>标记,但不知道如何适应结束标记({{} {1}}),因为无论</strong>语句的结果如何(即徽章和帖子计数),都需要存在文本。

谢谢!

更新

我现在收到一条回复,说明我需要在有一个月的博客帖子时输出一个链接(否则只是文本)。这是为了防止用户访问空白页面。

我设法通过这种方式解决了问题:

if

此时我想知道这是否是最佳方法?特别是Response.Write(),实际上是从C#输出到页面的最佳方式吗?

2 个答案:

答案 0 :(得分:2)

你可以定义一个类巫婆集

font-weight: bold;

根据您的条件添加课程或不添加课程

你的代码看起来像这样:

string stylingclass = String.Empty;
if(condition) {stylingclass = "YourCssClassHere";}

....
<a href="<%=archiveURL %>>" class="list-group-item <%=stylingclass%>"><%=monthCounter.ToString("MMMM yyyy") %>
....

答案 1 :(得分:1)

您可以将代码更改为Repeater,并将布局与逻辑分开,而不是直接输出文本并使用strong标记将其包围。您的中继器看起来与此类似:

<asp:Repeater ID="rptMonths" runat="server">
    <HeaderTemplate>
        <div class="list-group blog-archive">
    </HeaderTemplate>
    <ItemTemplate>
        <asp:MultiView runat="server" ActiveViewIndex='<%# Eval("ViewIndex") %>'>
            <asp:View runat="server">
                <asp:HyperLink runat="server" NavigateUrl='<%# Eval("ArchiveUrl") %>'
                      CssClass="list-group-item">
                    <asp:Label runat="server" Text='<%# Eval("MonthName") %>' 
                          CssClass='<%# Eval("MonthClass") %>' />
                    <span class="badge"><%# Eval("NumberOfPosts") %></span>
                </asp:HyperLink>
            </asp:View>
            <asp:View runat="server">
                <asp:Label runat="server" Text='<%# Eval("MonthName") %>'
                    CssClass='<%# Eval("MonthClass") %>' />
                <span class="badge"><%# Eval("NumberOfPosts") %></span>
            </asp:View>
        </asp:MultiView>
    </ItemTemplate>
    <FooterTemplate>
        </div>
    </FooterTemplate>
</asp:Repeater>

请注意,仅当设置了URL时,才使用MultiView呈现链接。此外,标签用于创建带有CssClass的跨度,以便您可以设置样式。

要提供数据,您需要一个与此类似的类:

public class MonthSummary
{
    public DateTime Month { get; set; }
    public string MonthName { get { return Month.ToString("MMMM"); } }
    public string MonthClass { get; set; }
    public string ArchiveUrl { get; set; }
    public int NumberOfPosts { get; set; }
    public int ViewIndex { get; set; }
}

加载页面时,您需要汇总月份数据,例如在PageLoad中:

public void Page_Load(object sender, EventArgs e)
{
    if (!Page.IsPostBack)
    {
        var lst = new List<MonthSummary>();
        for (var m = DateTime.Today.AddMonths(-5); m <= DateTime.Today; m = m.AddMonths(1))
        {
            var summary = new MonthSummary();
            summary.Month = m;
            if (int.Parse(SelectedYear) == m.Year && int.Parse(SelectedMonth) == m.Month)
                summary.MonthClass = "HighlightedMonth";
            else
                summary.MonthClass = string.Empty;
            summary.NumberOfPosts = 0; // get the number of posts in an appropriate way
            if (summary.NumberOfPosts > 0)
            {
                summary.ArchiveUrl = "~/BlogArchive?year=" + m.Year.ToString() + "&month=" + m.Month.ToString();
                summary.ViewIndex = 0;
            }
            else
            {
                summary.ArchiveUrl = string.Empty;
                summary.ViewIndex = 1;
            }
            lst.Add(summary);
        }
        rptMonths.DataSource = lst;
        rptMonths.DataBind();
    }

}

汇总数据时,请将ViewIndex更改为没有帖子的月份。第二个视图不包含超链接控件,因此不会呈现a标记。

最后,您需要在CSS中定义类以粗体格式化文本。