2017-04-25 111 views
0

加载应用程序时,会显示包含项目列表的表格。在asp.net mvc中管理状态C#

在点击保存按钮时,我想写出excel项目的列表。

当我点击保存按钮,在新的请求发送到控制器,列表是空的。我不喜欢把表项列表写入数据库。

任何人都可以告诉我如何处理这个问题?

public IActionResult SaveReport(SalesParentViewModel salesParentViewModel) 
    { 
     if(salesParentViewModel.SalesDataModelItems != null) 
     { 
      var buffer = new StringBuilder(); 
      buffer.AppendLine("#UserCode,SalesmanName,Date,ItemCode,ItemDescription,BrandCode,BrandName,ClientCode,Client,ClientBranchCode,Description, BranchSubChannel,TransactionAmount,Quantity"); 
      salesParentViewModel.SalesDataModelItems.ToList().ForEach(item => buffer.AppendLine 
      (String.Format("{0},{1},{2},{3},{4},{5},{6},{7},{8},{9},{10},{11},{12},{13}", item.UserCode, item.SALESMANNAME, item.DATE, item.ItemCode, item.ITEMDESCRIPTION, item.BRANDCODE, item.BRANDNAME, item.ClientCode, item.Client, item.ClientBranchCode, item.Description, item.BRANCHSUBCHANNEL, item.TrxAmount, item.QTY 
      ))); 
      System.IO.File.WriteAllText("c:\\temp\\file.csv", buffer.ToString()); 
     } 
     return View(); 
    } 

示意图如下:

@model MyStoreReports.ViewModels.SalesParentViewModel 

@{ 
    ViewBag.Title = "Sales Report"; 
} 

@section scripts{ 
    <script src="~/lib/jquery-validation-unobtrusive/dist/jquery.validate.unobtrusive.js"></script> 
<link rel="stylesheet" 
     href="http://cdn.datatables.net/1.10.2/css/jquery.dataTables.min.css"> 
<script type="text/javascript" 
     src="http://cdn.datatables.net/1.10.2/js/jquery.dataTables.min.js"></script> 
<script type="text/javascript" 
     src="http://maxcdn.bootstrapcdn.com/bootstrap/3.2.0/js/bootstrap.min.js"></script> 
} 

<div class="container-fluid"> 
    <div class="row"> 
     <div class="col-sm-9"> 
      <h1>Sales Report</h1> 

     </div> 
    </div> 
    <div> 
     <asp:Button id="btnFilter" class="btn btn-sm btn-info" runat="server" Text="Click Me!"> 
      <i class="fa fa-filter"></i>Filter 
     </asp:Button> 


     @using (Html.BeginForm("SaveReport", "App", FormMethod.Post)) 
     { 
      @Html.HiddenFor(model => model.SalesDataModelItems); 
      <asp:Button id="btnSave" class="btn btn-sm btn-info" onclick="location.href='@Url.Action("SaveReport","App")'" runat="server" Text="Click Me!"> 
       <i class="fa fa-save"></i>Save 
      </asp:Button> 
     } 

     @*<a href="#" class="btn btn-sm btn-info"> 
      <i class="fa fa-save"></i>Save 
     </a>*@ 
     <a href="#" class="btn btn-sm btn-info"> 
      <i class="fa fa-print"></i>Print 
     </a> 

    </div> 

    <div class="row"> 
     <form method="post"> 
      <asp:Panel id="pnlFilter" runat="server" GroupingText="This is a sample group text" HorizontalAlign="Center"> 
       <div class="col-sm-10" style="background-color:lavenderblush;"> 
        <div class="row"> 
         <div class="col-sm-2"> 
          <label asp-for="SalesViewModelInstance.StartDate">StartDate</label> 
          <div class="form-group"> 
           <input asp-for="SalesViewModelInstance.StartDate" type="date" class="form-control" /> 
           <span asp-validation-for="SalesViewModelInstance.StartDate" class="text-muted"></span> 
          </div> 
         </div> 

         <div class="col-sm-2"> 
          <label asp-for="SalesViewModelInstance.EndDate">EndDate</label> 
          <div class="form-group"> 
           <input asp-for="SalesViewModelInstance.EndDate" type="date" class="form-control" /> 
           <span asp-validation-for="SalesViewModelInstance.EndDate" class="text-muted"></span> 
          </div> 
         </div> 
         <div class="row"> 
            <div class="col-sm-1"> 
             <input type="submit" value="Submit" class="btn btn-success" /> 
            </div> 
            <div class="col-sm-1"> 
             <a asp-controller="App" asp-action="Index" class="btn btn-default">Cancel</a> 
            </div> 
           </div> 
        </div> 
         </asp:Panel> 
         </form> 
      </div> 

      <div class="form-group"> 
       @if (Model.SalesDataModelItems != null) 
       { 
         <div class="container" style="background-color:lavender;" > 
          <div class="row"> 
           <div class="panel panel-primary"> 
            <div class="panel-heading"> 
              <h2>Report</h2> 
            </div> 
            <div class="VScrollTable"> 
             <table id="myTable" class="table table-fixed table-responsive" align="left" cellspacing="0"> 
              <thead> 
               <tr> 
                <th>UserCode</th> 
                <th>SalesmanName</th> 
                <th>Date</th> 
                <th>ItemCode</th> 
                <th>ItemDescription</th> 
                <th>BrandCode</th> 
                <th>BrandName</th> 
                <th>ClientCode</th> 
                <th>Client</th> 
                <th>ClientBranchCode</th> 
                <th>Description</th> 
                <th>BranchSubChannel</th> 
                <th>TransactionAmount</th> 
                <th>Quantity</th> 
               </tr> 
              </thead> 
              @foreach (var item in Model.SalesDataModelItems) 
              { 
               <tbody> 
                <tr> 

                 <td>@item.UserCode</td> 
                 <td>@item.SALESMANNAME</td> 
                 <td>@item.DATE</td> 
                 <td>@item.ItemCode</td> 
                 <td>@item.ITEMDESCRIPTION</td> 
                 <td>@item.BRANDCODE</td> 
                 <td>@item.BRANDNAME</td> 
                 <td>@item.ClientCode</td> 
                 <td>@item.Client</td> 
                 <td>@item.ClientBranchCode</td> 
                 <td>@item.Description</td> 
                 <td>@item.BRANCHSUBCHANNEL</td> 
                 <td>@item.TrxAmount</td> 
                 <td>@item.QTY</td> 
                </tr> 
               </tbody> 
              } 
             </table> 
            </div> 

           </div> 

         </div> 
        </div> 
       } 

     </div>   
</div> 
+0

凡列表为空?在action方法参数salesParentViewModel中? –

+0

列表是SalesDataModelItems – Maria

+0

问题是你在哪里得到它为空,在你的动作参数中它是空的?如果是,那么你应该显示你用来发布视图模型到控制器的代码。 –

回答

1

如果没有变化在模型完成后,你为什么要整个模型从视图控制器通过? 只需传递一些像id这样的标识符,并再次获取控制器中的数据并将其保存在Excel中。

如果你必须通过模型回控制器是可以做到的,但数据需要被隐藏的输入或编辑输入控件(文本框,复选框)

您的视图应该类似于以下:

@model MyStoreReports.ViewModels.SalesParentViewModel 

@{ 
    ViewBag.Title = "Sales Report"; 
} 

@section scripts{ 
    <script src="~/lib/jquery-validation-unobtrusive/dist/jquery.validate.unobtrusive.js"></script> 
    <link rel="stylesheet" 
      href="http://cdn.datatables.net/1.10.2/css/jquery.dataTables.min.css"> 
    <script type="text/javascript" 
      src="http://cdn.datatables.net/1.10.2/js/jquery.dataTables.min.js"></script> 
    <script type="text/javascript" 
      src="http://maxcdn.bootstrapcdn.com/bootstrap/3.2.0/js/bootstrap.min.js"></script> 
} 

<div class="container-fluid"> 
    <div class="row"> 
     <div class="col-sm-9"> 
      <h1>Sales Report</h1> 

     </div> 
    </div> 
    <div> 

     @using (Html.BeginForm("SaveReport", "App", FormMethod.Post)) 
     { 
      <input id="brnSave" type="submit" class="btn btn-sm btn-info" value="Save" /> 

      <div class="form-group"> 
       @if (Model.SalesDataModelItems != null) 
       { 
        <div class="container" style="background-color:lavender;"> 
         <div class="row"> 
          <div class="panel panel-primary"> 
           <div class="panel-heading"> 
            <h2>Report</h2> 
           </div> 
           <div class="VScrollTable"> 
            <table id="myTable" class="table table-fixed table-responsive" align="left" cellspacing="0"> 
             <thead> 
              <tr> 
               <th>UserCode</th> 
               <th>SalesmanName</th> 
               <th>Date</th> 
               <th>ItemCode</th> 
               <th>ItemDescription</th> 
               <th>BrandCode</th> 
               <th>BrandName</th> 
               <th>ClientCode</th> 
               <th>Client</th> 
               <th>ClientBranchCode</th> 
               <th>Description</th> 
               <th>BranchSubChannel</th> 
               <th>TransactionAmount</th> 
               <th>Quantity</th> 
              </tr> 
             </thead> 
              @for (int i = 0; i < Model.SalesDataModelItems.Count; i++) 

             { 
              <tbody> 
               <tr> 
                <td>@Model.SalesDataModelItems[i].UserCode</td> 
                <td>@Model.SalesDataModelItems[i].SalesManName</td> 
                <td>@Model.SalesDataModelItems[i].SaleDate</td> 
                <td>@Model.SalesDataModelItems[i].ItemCode</td> 
                <td>@Model.SalesDataModelItems[i].ItemDescription</td> 
                <td>@Model.SalesDataModelItems[i].BrandCode</td> 
                <td>@Model.SalesDataModelItems[i].BrandName</td> 
                <td>@Model.SalesDataModelItems[i].ClientCode</td> 
                <td>@Model.SalesDataModelItems[i].ClientName</td> 
                <td>@Model.SalesDataModelItems[i].ClientBranchCode</td> 
                <td>@Model.SalesDataModelItems[i].Description</td> 
                <td>@Model.SalesDataModelItems[i].BranchSubChannel</td> 
                <td>@Model.SalesDataModelItems[i].TrxAmount</td> 
                <td>@Model.SalesDataModelItems[i].Quantity</td> 

                <td>@Html.HiddenFor(model => model.SalesDataModelItems[i].UserCode) </td> 
                <td>@Html.HiddenFor(model => model.SalesDataModelItems[i].SalesManName) </td> 
                <td>@Html.HiddenFor(model => model.SalesDataModelItems[i].SaleDate) </td> 
                <td>@Html.HiddenFor(model => model.SalesDataModelItems[i].ItemCode) </td> 
                <td>@Html.HiddenFor(model => model.SalesDataModelItems[i].ItemDescription) </td> 
                <td>@Html.HiddenFor(model => model.SalesDataModelItems[i].BrandCode) </td> 
                <td>@Html.HiddenFor(model => model.SalesDataModelItems[i].BrandName) </td> 
                <td>@Html.HiddenFor(model => model.SalesDataModelItems[i].ClientCode) </td> 
                <td>@Html.HiddenFor(model => model.SalesDataModelItems[i].ClientName) </td> 
                <td>@Html.HiddenFor(model => model.SalesDataModelItems[i].ClientBranchCode) </td> 
                <td>@Html.HiddenFor(model => model.SalesDataModelItems[i].Description) </td> 
                <td>@Html.HiddenFor(model => model.SalesDataModelItems[i].BranchSubChannel) </td> 
                <td>@Html.HiddenFor(model => model.SalesDataModelItems[i].TrxAmount) </td> 
                <td>@Html.HiddenFor(model => model.SalesDataModelItems[i].Quantity) </td> 

               </tr> 
              </tbody> 
             } 
            </table> 
           </div> 

          </div> 

         </div> 
        </div> 
       } 

      </div> 
     } 
    </div> 
</div> 

而像山本哲也指出,切忌混ASP网页表单控件在asp.net MVC应用程序

EDIT(后玛丽亚评论):

您可以添加一个AJAX调用保存按钮按下Excel中的数据:

控制器Savereport方法:

public ActionResult SaveReport() 
     { 
      try 
      { 
      // Get data from DB and save it in excel 

      return Json("Success save report"); 
      } 
      catch (Exception ex) 
      { 
       return Json("Save report failure!" + ex.Message); 
      } 


     } 

查看:

@model MVCWebApplication.Controllers.SalesParentViewModel 

@{ 
    ViewBag.Title = "Sales Report"; 
} 

@section scripts{ 
    <link rel="stylesheet" 
      href="http://cdn.datatables.net/1.10.2/css/jquery.dataTables.min.css"> 
    <script type="text/javascript" 
      src="http://cdn.datatables.net/1.10.2/js/jquery.dataTables.min.js"></script> 
    <script type="text/javascript" 
      src="http://maxcdn.bootstrapcdn.com/bootstrap/3.2.0/js/bootstrap.min.js"></script> 
} 

<div class="container-fluid"> 
    <div class="row"> 
     <div class="col-sm-9"> 
      <h1>Sales Report</h1> 

     </div> 
    </div> 
    <div> 

      <input id="btnSave" type="button" class="btn btn-sm btn-info" data-url="@Url.Action("SaveReport","App")" value="Save" /> 
      <div class="form-group"> 
       @if (Model.SalesDataModelItems != null) 
       { 
        <div class="container" style="background-color:lavender;"> 
         <div class="row"> 
          <div class="panel panel-primary"> 
           <div class="panel-heading"> 
            <h2>Report</h2> 
           </div> 
           <div class="VScrollTable"> 
            <table id="myTable" class="table table-fixed table-responsive" align="left" cellspacing="0"> 
             <thead> 
              <tr> 
               <th>UserCode</th> 
               <th>SalesmanName</th> 
               <th>Date</th> 
               <th>ItemCode</th> 
               <th>ItemDescription</th> 
               <th>BrandCode</th> 
               <th>BrandName</th> 
               <th>ClientCode</th> 
               <th>Client</th> 
               <th>ClientBranchCode</th> 
               <th>Description</th> 
               <th>BranchSubChannel</th> 
               <th>TransactionAmount</th> 
               <th>Quantity</th> 
              </tr> 
             </thead> 
             @foreach (var item in Model.SalesDataModelItems) 
             { 
              <tbody> 
               <tr> 
                <td>@item.UserCode</td> 
                <td>@item.SalesManName</td> 
                <td>@item.SaleDate</td> 
                <td>@item.ItemCode</td> 
                <td>@item.ItemDescription</td> 
                <td>@item.BrandCode</td> 
                <td>@item.BrandName</td> 
                <td>@item.ClientCode</td> 
                <td>@item.ClientName</td> 
                <td>@item.ClientBranchCode</td> 
                <td>@item.Description</td> 
                <td>@item.BranchSubChannel</td> 
                <td>@item.TrxAmount</td> 
                <td>@item.Quantity</td> 
                </tr> 
               </tbody> 
                } 

            </table> 
           </div> 
          </div> 

         </div> 
        </div> 
       } 

      </div> 

    </div> 
</div> 

<script> 
    $(function() { 
     $('#btnSave').on('click', function() { 
      $.ajax({ 
       url: $(this).data('url'), 
       type: 'post', 
       datatype: 'json', 
       contentType: 'application/json; charset=utf-8', 
       success: function (data) { 
        console.log(data); 
       }, 
       error: function (xhr) { 
        console.log(JSON.parse(xhr.responseText)); 

       } 
      }); 
     }); 
    }); 
</script> 
+0

你能否提一下如何将ID(指向模型)从视图传递给控制器​​?该模型包含巨大的数据值,正如你所提到的,我想传递id – Maria

+0

在你的场景中,你应该在加载视图之前调用SaveReport方法。它应该有一个不同的签名。只需从数据库中获取数据,将其保存为excel并加载视图。这些方法应该在你的控制器中。 – KD2ND

+0

我需要在视图页面上显示数据,只有当用户点击保存按钮它必须保存到excel – Maria