简体   繁体   中英

MVC: how can i hide a table if it has no value

Hi im quite new to mvc and im writing a report which gets data by country and retailer - if the country does not have a retailer an empty table is shown with 0 s in the columns.

What I want it to do is skip onto the next country and not show a table for that country at all

i have used

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

but the header and footer of the table is still shown - how can i hide it completely and just shown the next table with values?

controller code:

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);

View:

<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>

Thanks

Short answer: Check the length of the set before printing out the table. In your case:

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

Long answer, you will find questions like this answer themselves if you clean up your style. For example you should never find yourself using the Convert class in a view and you should use the ViewData structure very rarely (It is useful for things like 'the options to populate a dropdown with' but really should not be used for much else). You should just create a very simple class for the values you need and use that via the Model property (which you should have be that same type).

In addition most people have moved on to using the Razor view templates rather than what you're using (webforms). It is in some ways a personal preference but it is similar enough that it should take about 6 minutes to learn and you will find almost all current examples written in Razor. Here is a quick equivalence table .

I realize the above sounds harsh, but you should feel free to use StackOverflow as a resource - people on here will help and your coding really will get much easier.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM