2012-07-18 81 views
1
<div id="ProductionReport"> 
    <div class="ui-widget"> 
     @Using Ajax.BeginForm("Index", "Reports", ajaxOptions:=New AjaxOptions With {.InsertionMode = InsertionMode.Replace, .HttpMethod = "POST", .UpdateTargetId = "searchresultdata"}, htmlAttributes:=New With {.id = "productionform"}) 
      @Html.ValidationSummary(True) 
      @<fieldset class="ui-widget-content"> 
       <legend class="ui-state-default">Production Report</legend> 
       <div class="editor-label"> 
        @Html.LabelFor(Function(model) model.ProductionReportData.FromDate, "From Date: ") 
        @Html.Raw(" ") 
        @Html.TextBoxFor(Function(model) model.ProductionReportData.FromDate, New With {.class = "ui-state-default", .id = "datepicker", .Style = "font-size:x-small;", .name = "fromdate"}) 
        @Html.ValidationMessageFor(Function(model) model.ProductionReportData.FromDate) 
       </div> 
       <div class="editor-label"> 
        @Html.LabelFor(Function(model) model.ProductionReportData.ToDate, "To Date: ") 
        @Html.Raw(" ") 
        @Html.TextBoxFor(Function(model) model.ProductionReportData.ToDate, New With {.class = "ui-state-default", .id = "datepicker2"}) 
        @Html.ValidationMessageFor(Function(model) model.ProductionReportData.ToDate) 
       </div> 
       <div class="editor-label"> 
        @Html.LabelFor(Function(model) model.ProductionReportData.ShowDetails, "Show Details: ") 
        @Html.EditorFor(Function(model) model.ProductionReportData.ShowDetails) 
       </div> 
       <div class="editor-label"> 
        <input class="ui-button ui-button-text-only ui-widget ui-state-default ui-corner-all" 
         type="submit" value="Search" name="btnSearch" /> 
        <input class="ui-button ui-button-text-only ui-widget ui-state-default ui-corner-all" 
         type="submit" value="Export Data" name="btnSearch" /> 
       </div> 
      </fieldset> 
     End Using 
    </div> 
    <div id="searchresultdata" class="ui-widget-content"> 
    </div> 
</div> 

enter code h<HttpPost()> _ 
    Function ExportProductionReportData(ByVal data As ReportsModel) As FileResult 


     Dim var = From I In db.scll_label Join P In db.pt_mstr On I.scll_part Equals P.pt_part _ 
        Join C In db.sclws_cfg On I.scll_wsid Equals C.sclws_id _ 
        Where P.pt_domain = "mueller" And C.sclws_domain = "mueller" _ 
        And I.scll_transactiondate >= data.ProductionReportData.FromDate And I.scll_transactiondate <= data.ProductionReportData.ToDate _ 
        Select I, P.pt_length, P.pt_net_wt, P.pt_desc1, P.pt_tol_high, P.pt_part_type, P.pt_um, _ 
        C.sclws_proj_code, C.sclws_site 

     Dim ProMod As New ProductionReportModel 
     ProMod.ProductionDetails = New ObservableCollection(Of ProductionReportDetails) 
     ProMod.ProductionGrandTotal = New ProductionReportGrandTotals 
     ProMod.ProductionPartTotals = New ObservableCollection(Of ProductionReportTotalsByPart) 


     ''Generate Production Details 
     For Each rec In var 

      Dim proModDtls As New ProductionReportDetails 

      proModDtls.Customer = rec.I.scll_cust 
      proModDtls.Feet = rec.I.scll_total_feet 
      proModDtls.GrossWeight = rec.I.scll_weight 
      proModDtls.NetWeight = rec.I.scll_weight - rec.I.scll_total_tare 
      proModDtls.Part = rec.I.scll_part 

      If rec.pt_um = "LB" Then 
       Try 
        proModDtls.Pieces = rec.I.scll_total_feet/rec.pt_length 
       Catch ex As Exception 
        proModDtls.Pieces = rec.I.scll_qty 
       End Try 
      ElseIf rec.pt_um = "FT" Then 
       Try 
        proModDtls.Pieces = rec.I.scll_qty/rec.pt_length 
       Catch ex As Exception 
        proModDtls.Pieces = rec.I.scll_qty 
       End Try 
      Else 
       proModDtls.Pieces = rec.I.scll_qty 
      End If 

      proModDtls.Quantity = rec.I.scll_qty 

      proModDtls.ReasonCode = rec.sclws_proj_code 

      proModDtls.StandardWeight = rec.I.scll_std_weight 

      proModDtls.Station = rec.I.scll_wsid 

      proModDtls.Tare = rec.I.scll_total_tare 

      proModDtls.TareDetail = rec.I.scll_tare_detail 

      proModDtls.Ticket = rec.I.scll_ticket 

      Try 
       proModDtls.DrawingEfficiency = ((rec.I.scll_weight - rec.I.scll_total_tare)/rec.I.scll_std_weight) * 100 

      Catch ex As Exception 

      End Try 

      proModDtls.TicketDate = rec.I.scll_transactiondate 

      ProMod.ProductionDetails.Add(proModDtls) 

     Next 
     Dim csvCreator As New CSVFileMaker(Of ProductionReportDetails, List(Of ProductionReportDetails)) 
     csvCreator.data = ProMod.ProductionDetails.ToList 
     Dim csvdata As String = csvCreator.GenerateCSVFile 
     Dim d = Encoding.ASCII.GetBytes(csvdata) 
     Dim filename As String = "ProductionReport" & Date.Now.Year.ToString & "_" & Date.Now.Month.ToString & "_" & Date.Now.Day & ".csv" 
     Dim cd = New System.Net.Mime.ContentDisposition With {.FileName = filename, .Inline = False, .DispositionType = "attachment"} 
     Response.AppendHeader("Content-Disposition", cd.ToString) 
     Return File(d, "text/csv", filename) 




    End Function 

'GET:/报告 _ 功能指数(BYVAL btnSearch作为字符串,BYVAL数据作为ReportsModel)作为的ActionResultMVC3 Ajax.BeginForm下载后文件

 data.DrawingEfficiencyWeeklyData = New DrawingEfficiencyWeeklyData 
     data.DrawingEfficiencyPeriodData = New DrawingEfficiencyPeriodData 
     data.DrawingEfficiencyYearlyData = New DrawingEfficiencyYearlyData 
     data.DrawingEfficiencyYearlyMeanData = New DrawingEfficiencyYearlyMeanData 
     data.DrawingEfficiencySummaryData = New DrawingEfficiencySummaryData 
     data.ToleranceOverrideReportData = New ToleranceOverrideReportData 
     data.TareDetailReportData = New TareDetailReportData 

     Dim var = db.GetGLCYears 
     Dim var2 = db.GetGLCYears 
     Dim var3 = db.GetGLCYears 
     Dim var4 = db.GetGLCYears 

     Dim allList As New SelectListItem With {.Value = 0, .Text = "All"} 
     Dim BonusList As New SelectListItem With {.Value = 1, .Text = "Bonus"} 
     Dim OtherList As New SelectListItem With {.Value = 2, .Text = "Other"} 

     Dim categoryList As New List(Of SelectListItem) 
     categoryList.Add(allList) 
     categoryList.Add(BonusList) 
     categoryList.Add(OtherList) 

     data.DrawingEfficiencyYearlyMeanData.CategoryList = categoryList 
     data.DrawingEfficiencyYearlyMeanData.YearList = var4.Select(Function(i) New SelectListItem With {.Value = i.Y, .Text = i.Y}) 
     data.DrawingEfficiencyWeeklyData.YearList = var.Select(Function(i) New SelectListItem With {.Value = i.Y, .Text = i.Y}) 
     data.DrawingEfficiencyPeriodData.YearList = var2.Select(Function(i) New SelectListItem With {.Value = i.Y, .Text = i.Y}) 
     data.DrawingEfficiencyYearlyData.YearList = var3.Select(Function(i) New SelectListItem With {.Value = i.Y, .Text = i.Y}) 

     Select Case btnSearch 

      Case Is = "Search" 
       Return (SearchProductionReport(data)) 
      Case Is = "Export Data" 
       Return ExportProductionReportData(data) 
      Case Else 
       Return View(data) 
     End Select 

     Return View(data) 
    End Function 

基本上我的形式发送Ajax响应分区,其中包含部分视图,但我有另一个提交按钮,使用相同的数据来生成一个CSV文件。我无法得到这个文件下载它只是输出到div。任何人都可以帮助或引导正确的方向..我已经尝试actionlinks,但它永远不会坚持我的模型到数据库我不能使用html.beginforms,因为我不能设置一个目标div加载部分视图到。

更新:使用脚本,但仍然没有工作

<script type="text/javascript"> 
$(document).ready(function() { 
    $("#productionsearch").click(function() { 
     $("#productionform").submit(function() { 
      $.ajax({ 
       url: this.action, 
       type: this.action, 
       data: $(this).serialize(), 
       success: function (result) { 
       $("#searchresultdata").html(result); 
       } 
      }); 
     }); 
    }); 
}); 

`

回答

1

不能使用AJAX来下载文件。只需使用正常的Html.BeginForm即可。

+0

所以,我怎么可以更新的结果DIV当我需要显示的局部视图。我有两个按钮之一,它运行查询并返回呈现为div的部分视图,第二个按钮允许您使用csv下载文件。是否有另一种方式,我可以获得与HTML.BeginForm相同的功能在Ajax.Begin ajaxoptions中的示例您有一个updatetargetid我可以用HTML.BeginForm实现此功能 – Jdsurgeon 2012-07-19 13:04:01

+0

当您下载文件时,系统会提示用户保存他电脑上的文件。该视图不会刷新。 – 2012-07-19 13:10:13

+0

我想我可能没有正确解释这一点。我需要表单中的值来生成视图或下载。我不想为了显示视图而去新的页面。它在结果下面填写了一个div。我只是希望能够在div中填充视图并获取表单数据并创建一个csv下载文件。这在aspx时代非常简单。但我不能使用mvc3 ... – Jdsurgeon 2012-07-19 13:17:06

0
<script type="text/javascript"> 
$(document).ready(function() { 
    $("#ProductionSearch").click(function() { 
     alert("Button Clicked"); 
     var $form = $("#ProductionSearch").parents('form') 
     $.ajax({ 
      type: "POST", 
      url: "@URL.Action("SearchProductionReport")", 
      data: $form.serialize(), 
      error: function (xhr, status, error) { 
       alert("an error occurred" + error) 
      }, 
      success: function (response) { 
       alert("Function worked"); 
       $("#searchresultdata").html(response); 
      } 
     }); 
    }); 
}); 

答案。我想到了。使用HTML.BeginForm(“YourDownloadAction”,“YourController”,“表单ID”) 然后创建两个类型为submit的按钮,另一个类型为button。确保你的javascript正在调用不需要下载文件的操作。就是这样。现在你必须实现验证,因为它不会通过jquery在ajax调用中实现......感谢Darin你至少指出了我正确的方向。

更新了验证

<script type="text/javascript"> 
$(document).ready(function() { 
    $("#ProductionSearch").click(function() { 
     var $form = $("#ProductionSearch").parents('form') 
     if ($($form).validate().form() == true) { 
     $.ajax({ 
      type: "POST", 
      url: "@Url.Action("SearchProductionReport", "Reports", Nothing)", 
      data: $form.serialize(), 
      error: function (xhr, status, error) { 
       $("#dialog").dialog("open"); 
       $("#dialog").html("<p>Please be advised that an error has occured while searching production data please try again or contact your administrator</p> " +"<br>" + error + "</br>"); 
      }, 
      success: function (response) { 
       $("#searchresultdata").html(response); 
      } 
     }); 
     } 
    }); 
}); 

+0

这里是脚本验证,如果有人需要它,但你的模型必须dataannotated。 – Jdsurgeon 2012-07-19 17:44:15