2012-02-01 21 views
0

こんにちは私はmvcとimには新しく、国と小売業者によってデータを取得するレポートを作成しています - 国に小売店がない場合空のテーブルは0列内にある。私はそれが何をしたいのか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

レコードのアンナにとって、これは長い間アクションメソッドを持つのは非常に悪いフォームと考えられます。一般的には、処理をモデルまたはサービス・クラスに入れたいとします。私の個人的な経験則は、アクションメソッドでは5行を超えないコードです。さらに、ViewDataは非常にまれにしか使用しないでください。モデルクラスを作成したばかりの場合、多くのロジックが*ロット*でシンプルで明確になります。 –

+0

ありがとうございます。 – anna

+0

このデータをすべてView Dataに詰め込む特別な理由はありますか?すべてのデータをモデルまたはビューモデルに渡すのではなく、大きなストレージコンテナのように使用しています。 –

答えて

1

短い答え:表をプリントアウトする前にセットの長さを確認してください。あなたのケースでは :

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

ロング答えは、あなたがあなたのスタイルをクリーンアップする場合は、これは自分自身に答えるような質問があります。たとえばは決してであるはずです。ビューでConvertクラスを使用することはごくありません.ViewData構造は非常にまれにしか使用しないでください( 'ドロップダウンに値を設定するオプションは便利ですが、 )。必要な値に対して非常に単純なクラスを作成し、Modelプロパティ(同じタイプでなければならない)を使ってそれを使用するだけです。

さらに、ほとんどの人は、使用しているもの(ウェブフォーム)ではなく、Razorビューテンプレートを使用しています。それはいくつかの点で個人的な好みですが、それは習得するのに約6分かかるはずで、あなたはRazorで書かれたほとんどすべての例を見つけるでしょう。 Here is a quick equivalence table

私は上記の音が酷いことを認識していますが、リソースとしてStackOverflowを自由に使用することができます。ここにいる人が役に立ち、コーディングはもっと簡単になります。

+0

ありがとう - 私は間違いなく剃刀を調べます – anna

関連する問題