2014-03-31 88 views
0

這個的全部含義是,我試圖從我的視圖中獲取一張表,並使用EPPlus從它創建一個Excelsheet。我在我的視圖中有一張表格,其中html助手可以顯示來自我的模型的值。當表格完全創建時,我想在點擊按鈕時將它發送給我的控制器。當表在我的控制器中時,我需要訪問表值,以便從那裏創建我的Excelsheet。將MVC表從MVC中的視圖發送到控制器

我現在面臨的最大問題是,我無法成功發送我的HTML表格到我的控制器。當我在控制器中使用它時,如何訪問這些值?如果可能的話(我猜不是)將表格作爲DataTable發送給控制器會很好。到目前爲止,我已經使用AJAX的嘗試,但我如果有任何其他的方式,我可以與工作以及

我的觀點:

@model IEnumerable<CalcFactory.Models.Calculation> 
<table cellspacing="0" width="80%" id"detailTable"> 
@{var rowID = 0;} 
@{var cellID = 1;} 
@foreach (var item in Model) 
{ 
    <tr id="@rowID"> 
     <td align="center"> 
      @rowID 
     </td> 
     <td align="center" id="[email protected]"> 
      @Html.DisplayFor(modelItem => item.PeriodStartDate) 
      - @Html.DisplayFor(modelitem => item.PeriodEndDate) 
     </td> 
     <td align="center" id="[email protected]"> 
      @Html.DisplayFor(modelItem => item.InvoiceAmount) 
     </td> 
     <td align="center" id="[email protected]"> 
      @Html.DisplayFor(modelItem => item.InterestRate) 
     </td> 
     <td align="center" id="[email protected]"> 
      @Html.DisplayFor(modelItem => item.InterestAmount) 
     </td> 
     <td align="center" id="[email protected]"> 
      @Html.DisplayFor(modelItem => item.Amortization) 
     </td> 
     <td align="center" id="[email protected]"> 
      @Html.DisplayFor(modelItem => item.PresentValue) 
     </td> 
    </tr> 
    rowID++; 
    cellID++; 
} 
</table> 

我的控制器:

public class SaveController : Controller 
{ 
    public ActionResult SaveExcel(DateTable dt) 
    { 
     //Work with table values here. How? 
    } 
} 

我的JS:

$(document).on('click', '#saveIcon', function() { 
    var data = $('#detailTable').html(); 
    var url = "/Save/SaveExcel"; 
    $.ajax({ 
     type: 'POST', 
     url: url, 
     data: data, 
     datatype: DataTable 
    )} 
}); 

我的模型:

public partial class Calculation 
{ 
    [DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}")] 
    public DateTime PeriodStartDate { get; set; } 

    [DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}")] 
    public DateTime PeriodEndDate { get; set; } 

    [DisplayFormat(DataFormatString = "{0:.00}")] 
    public decimal InvoiceAmount { get; set; } 

    [DisplayFormat(DataFormatString = "{0:P6}")] 
    public decimal InterestRate { get; set; } 

    [DisplayFormat(DataFormatString = "{0:.00}")] 
    public decimal InterestAmount { get; set; } 

    [DisplayFormat(DataFormatString = "{0:.00}")] 
    public decimal Amortization { get; set; } 

    [DisplayFormat(DataFormatString = "{0:.00}")] 
    public decimal PresentValue { get; set; } 

    [DisplayFormat(DataFormatString = "{0:.00}")] 
    public decimal StartValue { get; set; } 

    public int NumberOfDays { get; set; } 
} 
+1

您需要將模型傳遞給控制器​​方法,而不是數據表。另外,您需要首先序列化表單,而不是發佈表單的html – mituw16

+0

您不能在jQuery中使用一種'DataTable'類型,大多數人會使用表單編碼或JSON來提交表格。然後從服務器,你可以綁定/反序列化JSON到模型或類似的東西。 –

+0

你有代碼幫助嗎?我是一個新的這.. – MrProgram

回答

0

您不需要將模型數據發送到視圖,然後返回到控制器。您需要將模型數據直接發送到Excel。您可能會將Excel視爲視圖。

有很多與此相關的資源。以下是通過搜索「MVC導出到Excel C#」

Export data to Excel file with ASP.NET MVC 4 C# is rendering into view

從上面的螺紋期運用的例子找到了一個我,還有一個方法 - 公衆的ActionResult ExportToExcel()

您可以創建一個按鈕(一個鏈接真的),這將稱爲這種方法。因此,該鏈接會是這樣,比如...

<a href="yourcontrollername/ExportToExcel">export to excel</a> 

編輯 - 我只注意到你的Ajax調用......這就是你會調用該方法,所以......

$(document).on('click', '#saveIcon', function() { 

$('#mylinkid').click(function() { 
+0

但我只想在點擊按鈕時創建它?所以這是用戶選擇 – MrProgram

+0

的權利 - 按鈕會調用創建excel的例程。我會添加一些細節到我原來的答案。 – tintyethan

0

我認爲你最好做的事情是當你點擊按鈕時重新運行查詢。是否有某種標識符可用於運行相同的查詢?

我的建議是將某種標識傳遞給控制器​​中的操作方法。然後,您重新運行查詢以獲取相同的數據(或更新的數據)。您可以使用它來填充電子表格。

如果您絕對需要,您可以將整個模型從視圖發佈到控制器,但似乎並不必要。

+0

該模型用於創建年金計算,它們都可以不同於彼此。在我的腦海裏(並不意味着它是正確的)我需要得到第一個或整個模型(因爲第二個取決於第一個模型,依此類推) – MrProgram

+0

不能重新運行控制器中的計算嗎?無論您用什麼方法在視圖中生成表格,都應該爲電子表格生成數據,不是嗎?你永遠不會希望將表格中的html傳遞給控制器​​。至多你會想把模型傳遞給控制器​​,但在這種情況下,我不認爲這是必要的。你也一般不想要一個「SaveController」。也許更像AnnuityController?它應該與您的View類似的文件夾結構。 – bsayegh

+0

我有一個AnnuityController進行計算。我會嘗試你的方法,似乎工作(再次,在我的腦海中) – MrProgram

相關問題