MVC:如果没有值,我怎么能隐藏一个表

时间:2012-02-01 15:39:07

标签: c# asp.net-mvc

嗨我对mvc很新,我正在编写一份报告,按国家/地区和零售商获取数据 - 如果该国家没有零售商,则会在列中显示空表。

我想要它做的是跳到下一个国家,而不是显示该国家/地区的表格

我用过

ViewData["retailersForCountry"] = retailersForCountry;
if (retailersForCountry == 0)
{
    continue;
}

但是表格的页眉和页脚仍然显示 - 我怎样才能完全隐藏它并只显示带有值的下一个表?

控制器代码:

case "CUMLEADS":
    // Report Title
    ViewData["title"] = reportRequest.Title;

    // Store the ReportRequest Id
    ViewData["reportRequestId"] = reportRequest.Id;

    // number Of COuntries so that we can set our outermost loop
    var numberOfCountriesCumLeads = Convert.ToInt32(_reportValueRepository.GetReportPair(reportRequest.Id, "numberOfCountries").Value);
    ViewData["numberOfCountries"] = numberOfCountriesCumLeads;

    // Our outermost country loop

    for (int cumLeadsI = 1; cumLeadsI <= numberOfCountriesCumLeads; cumLeadsI++)
    {
        int cumulativeTotalForCountry = 0;

        // Get the number of Retailers for this country -check that the amount of retailers is not 0 if it is then skip to next country
        var retailersForCountry = Convert.ToInt32(_reportValueRepository.GetReportPair(reportRequest.Id, "retailersForCountry" + cumLeadsI).Value);
        //TODO
        //If retailerForCountry = 0 then go to next country - need to remove the header footer
        ViewData["retailersForCountry"] = retailersForCountry;
        if (retailersForCountry == 0)
        {
            continue;
        }
        ViewData["retailersForCountry" + cumLeadsI] = retailersForCountry;

        var totalRetailPerCountry = new int[retailersForCountry + 1];

        for (int numRetailer = 1; numRetailer <= retailersForCountry; numRetailer++)
        {
            ViewData["retailer" + numRetailer + "forCountry" + cumLeadsI + "Name"] = _reportValueRepository.GetReportPair(reportRequest.Id, "retailer" + numRetailer + "forCountry" + cumLeadsI + "Name").Value;
        }

        // get the country name
        ViewData["country" + cumLeadsI + "Name"] = _reportValueRepository.GetReportPair(reportRequest.Id, "country" + cumLeadsI + "Name").Value;

        // We need to go through the dates in order

        // Create a loop that will go through the range of dates that we have in the request
        var myStartDate = reportRequest.StartDate;

        // I need to store in the view the total number of weeks that we are going to do, and then for each ith week store the week number and the date range for that week
        var actualEndDate = reportRequest.EndDate;
        TimeSpan timespan = actualEndDate.Subtract(myStartDate);
        int numberOfWeeks = timespan.Days / 7;
        ViewData["numberOfWeeks" + cumLeadsI] = numberOfWeeks;
        int cumLeadsJ = 1;

        while (myStartDate.CompareTo(reportRequest.EndDate) < 0)
        {
            int totalForWeek = 0;
            var myEndDate = myStartDate.AddDays(6);
            if (myEndDate.CompareTo(reportRequest.EndDate) > 0)
            {
                myEndDate = reportRequest.EndDate;
            }

            // Store the Range of the data for display
            ViewData["weekRange" + cumLeadsI + "Range" + cumLeadsJ] = myStartDate.ToShortDateString() + "-" + myEndDate.ToShortDateString();

            // Go through each of the retailers for this date and this country to do 1 row
            DateTimeFormatInfo dfi = DateTimeFormatInfo.CurrentInfo;
            Calendar cal = dfi.Calendar;
            ViewData["weekNumber" + cumLeadsI + "Range" + cumLeadsJ] = cal.GetWeekOfYear(myStartDate, dfi.CalendarWeekRule, dfi.FirstDayOfWeek);

            // I need to loop thougth each of the retailers for this country and get the values for this myStartDate to put into the view
            for (int cumLeadsK = 1; cumLeadsK <= retailersForCountry; cumLeadsK++)
            {
                var retailerForWeek = Convert.ToInt32(_reportValueRepository.GetReportPair(reportRequest.Id, "retailer" + cumLeadsK + "forCountry" + cumLeadsI + myStartDate + "Count").Value);
                ViewData["weekNumber" + cumLeadsI + "Range" + cumLeadsJ + "retailer" + cumLeadsK] = retailerForWeek;
                totalForWeek += retailerForWeek;
                totalRetailPerCountry[cumLeadsK] += retailerForWeek;
            }

            ViewData["weekNumber" + cumLeadsI + "Range" + cumLeadsJ + "totalForWeek"] = totalForWeek;
            cumulativeTotalForCountry += totalForWeek;
            ViewData["weekNumber" + cumLeadsI + "Range" + cumLeadsJ + "cumulativeForWeek"] = cumulativeTotalForCountry;

            // Move onto the next week
            myStartDate = myStartDate.AddDays(7);
            cumLeadsJ++;
        }

        int crossTotal = 0;
        // I need to loop though each of the retailers for this country and get the values for this myStartDate to put into the view
        for (int cumLeadsK = 1; cumLeadsK <= retailersForCountry; cumLeadsK++)
        {
            crossTotal += totalRetailPerCountry[cumLeadsK];
            ViewData["retailerTotalForCountry" + cumLeadsI + "RetailerTotal" + cumLeadsK] = totalRetailPerCountry[cumLeadsK];

        }
        ViewData["crossTotal" + cumLeadsI] = crossTotal;

        for (int cumLeadsK = 1; cumLeadsK <= retailersForCountry; cumLeadsK++)
        {
            ViewData["percentageForRetailer" + cumLeadsI + "RetailerPercentage" + cumLeadsK] = Convert.ToDouble(totalRetailPerCountry[cumLeadsK]) / Convert.ToDouble(crossTotal) * 100.0;
        }

        ViewData["numberOfWeeks"] = cumLeadsJ;
    }
    return View(report.Code);

查看:

<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
    <%: ViewData["title"] %>
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
    <h1 title="<%: ViewData["title"] %>">
        <%: ViewData["title"]%>
    </h1>
    <% for (int cumLeadsI = 1; cumLeadsI <= Convert.ToInt32(ViewData["numberOfCountries"]); cumLeadsI++)
       { %>

    <h2 title="<%: ViewData["country" + cumLeadsI + "Name"] %>">
        <%: ViewData["country" + cumLeadsI + "Name"] %></h2>
    <table style="font-size: 80%; border-collapse: collapse; margin-left: 10px;">
        <thead>
            <tr style="background-color: #f3f3f3; font-weight: bold;">
                <td>
                    &nbsp; Week&nbsp;
                </td>
                <td>
                    &nbsp; Week number&nbsp;
                </td>
                <% for (int numRetailer = 1; numRetailer <= Convert.ToInt32(ViewData["retailersForCountry" + cumLeadsI]); numRetailer++)
                   { %>
                <td>
                    &nbsp;
                    <%: ViewData["retailer" + numRetailer + "forCountry" + cumLeadsI + "Name"]%>&nbsp;
                </td>
                <% } %>
                <td>
                    &nbsp; Total&nbsp;
                </td>
                <td>
                    &nbsp; Cummulative Total&nbsp;
                </td>
            </tr>
        </thead>
        <tbody>
            <% for (int cumLeadsJ = 1; cumLeadsJ <= Convert.ToInt32(ViewData["numberOfWeeks"]); cumLeadsJ++)
               {%>
            <% if (cumLeadsJ % 2 != 0)
               { %>
            <tr>
                <% }
               else
               { %>
                <tr style="background-color: #f3f3f3;">
                    <% } %>
                    <td>
                        <%: ViewData["weekRange" + cumLeadsI + "Range" + cumLeadsJ] %>
                    </td>
                    <td>
                        <%: ViewData["weekNumber" + cumLeadsI + "Range" + cumLeadsJ] %>
                    </td>
                    <% for (int cumLeadsK = 1; cumLeadsK <= Convert.ToInt32(ViewData["retailersForCountry" + cumLeadsI]); cumLeadsK++)
                       { %>
                    <td>
                        <%: ViewData["weekNumber" + cumLeadsI + "Range" + cumLeadsJ + "retailer" + cumLeadsK] %>
                    </td>
                    <% } %>
                    <td>
                        <%: ViewData["weekNumber" + cumLeadsI + "Range" + cumLeadsJ + "totalForWeek"] %>
                    </td>
                    <td>
                        <%: ViewData["weekNumber" + cumLeadsI + "Range" + cumLeadsJ + "cumulativeForWeek"] %>
                    </td>
                </tr>
                <% } %>
        </tbody>
        <tfoot>
            <tr style="border-top: 1px solid black; font-weight: bold; background-color: #f3f3f3; ">
                <td style="text-align:left;">
                    Total
                </td>
                <td>
                    &nbsp;
                </td>
                <% for (int cumLeadsK = 1; cumLeadsK <= Convert.ToInt32(ViewData["retailersForCountry" + cumLeadsI]); cumLeadsK++)
                   {%>
                <td>
                    <%: ViewData["retailerTotalForCountry" + cumLeadsI + "RetailerTotal" + cumLeadsK] %>
                </td>
                <%
                   }%>
                <td>
                    &nbsp;
                </td>
                <td>
                    <%: ViewData["crossTotal" + cumLeadsI]%>
                </td>
            </tr>
            <tr style="font-weight: bold; background-color: #f3f3f3; border-bottom: 1px solid black; ">
                <td style="text-align:left;">
                    Reseller Share
                </td>
                <td>
                    &nbsp;
                </td>
                <% for (int cumLeadsK = 1; cumLeadsK <= Convert.ToInt32(ViewData["retailersForCountry" + cumLeadsI]); cumLeadsK++)
                   {%>
                <td>
                    &nbsp;
                    <%: Convert.ToDouble(ViewData["percentageForRetailer" + cumLeadsI + "RetailerPercentage" + cumLeadsK]).ToString("F")  %>%&nbsp;
                </td>
                <%
                   }%>
                <td>
                    &nbsp;
                </td>
                <td>
                    &nbsp;
                </td>
            </tr>
        </tfoot>
    </table>

由于

1 个答案:

答案 0 :(得分:1)

简答:在打印出表格之前检查集合的长度。 在你的情况下:

<% if(Convert.ToInt32(ViewData["retailersForCountry" + cumLeadsI]) > 0 ) {%>
  <table>
   .....

答案很长,如果你清理你的风格,你会发现这样的问题自己回答。例如,你应该永远不会在视图中发现自己使用Convert类,你应该很少使用ViewData结构(这对于'填充下拉列表的选项'非常有用'但实际上不应该用于其他许多事情)。您应该为您需要的值创建一个非常简单的类,并通过Model属性(您应该使用相同的类型)来使用它。

此外,大多数人已经开始使用Razor视图模板而不是您正在使用的(webforms)。它在某些方面是个人偏好,但它足够相似,它需要大约6分钟的学习时间,你会发现几乎所有当前的例子都是用Razor编写的。 Here is a quick equivalence table

我意识到上述声音非常刺耳,但你应该随意使用StackOverflow作为资源 - 这里的人会帮助你,你的编码会变得更容易。