2013-08-06 149 views
2

控制器的方法當用戶點擊Html.ActionLink,我需要調用一個控制器的方法,將下載該用戶的csv報告。我還需要將這個控制器的值從兩個輸入框中傳遞出來,它們表示他們正在查找的開始日期和結束日期範圍。傳遞輸入參數,通過Html.ActionLink

目前我可以指定使用jQuery的Html.ActionLink參數,但是他們沒有把它回控制器。控制器方法中的兩個參數都使用null值進行實例化。

我也不能使用表單/提交方式爲已經被這種特殊的形式來讓用戶看到導出到CSV之前要求在日期範圍內的數據。

的jQuery

$(document).ready(function() { 
    $('#startDate').change(function() { 
     $('a').attr('start', $(this).val()); 
    }); 

    $('#endDate').change(function() { 
     $('a').attr('end', $(this).val()); 
    }); 
}); 

ASP MVC 3查看

@using (Html.BeginForm()) 
{ 
    <div id="searchBox"> 
     @Html.TextBox("startDate", ViewBag.StartDate as string, new { placeholder = " Start Date" }) 
     @Html.TextBox("endDate", ViewBag.EndDate as string, new { placeholder = " End Date" }) 
     <input type="image" src="@Url.Content("~/Content/Images/Search.bmp")" alt="Search" id="seachImage"/> 
     <a href="#" style="padding-left: 30px;"></a> 
    </div> 
    <br /> 
    @Html.ActionLink("Export to Spreadsheet", "ExportToCsv", new { start = "" , end = ""}) 
    <span class="error"> 
     @ViewBag.ErrorMessage 
    </span> 
} 

控制器方法

public void ExportToCsv(string start, string end) 
    { 

     var grid = new System.Web.UI.WebControls.GridView(); 

     var banks = (from b in db.AgentTransmission 
        where b.RecordStatus.Equals("C") && 
          b.WelcomeLetter 
        select b) 
        .AsEnumerable() 
        .Select(x => new 
           { 
            LastName = x.LastName, 
            FirstName = x.FirstName, 
            MiddleInitial = x.MiddleInitial, 
            EffectiveDate = x.EffectiveDate, 
            Status = x.displayStatus, 
            Email = x.Email, 
            Address1 = x.LocationStreet1, 
            Address2 = x.LocationStreet2, 
            City = x.LocationCity, 
            State = x.LocationState, 
            Zip = "'" + x.LocationZip, 
            CreatedOn = x.CreatedDate 
           }); 


     grid.DataSource = banks.ToList(); 
     grid.DataBind(); 

     string style = @"<style> .textmode { mso-number-format:\@; } </style> "; 

     Response.ClearContent(); 
     Response.AddHeader("content-disposition", "attachment; filename=WelcomeLetterOutput.xls"); 
     Response.ContentType = "application/excel"; 
     StringWriter sw = new StringWriter(); 
     HtmlTextWriter htw = new HtmlTextWriter(sw); 
     grid.RenderControl(htw); 
     Response.Write(style); 
     Response.Write(sw.ToString()); 
     Response.End(); 
    } 

回答

3

我認爲問題在於鏈接沒有「開始」或「結束」屬性。所以$('a').attr('start', $(this).val());不會做任何事情。

<a href="#" id="lnkExport">Export to Spreadsheet</a> 

$('#lnkExport').click(function (e){ 
e.preventDefault(); 
window.location = '/Home/ExportToCsv?start=' + $('#startDate').val() + '&end=' + $('#endDate').val(); 
}); 
+0

謝謝!我使用''@ Url.Action(「ExportToCsv」,「Agent」)'來獲取URL,但這正是我所期待的。謝謝! – NealR

+0

很高興爲你效勞! –

1

我也不能使用表單/提交方法作爲已經被使用 這種特殊形式以允許用戶看到導出到CSV之前所要求的日期 範圍內的數據。

實際上,您可以在窗體內部提交2個按鈕,並在您的POST控制器操作中知道哪個按鈕被點擊以執行相應操作。就這樣:

<button type="submit" name="btn" value="search">Search</button> 
<button type="submit" name="btn" value="export">Export to Spreadsheet</button> 

現在你的控制器動作可以採取btn說法:

[HttpPost] 
public ActionResult SomeAction(MyViewModel model, string btn) 
{ 
    if (btn == "search") 
    { 
     // The search button was clicked, so do whatever you were doing 
     // in your Search controller action 
    } 
    else if (btn == "export") 
    { 
     // The "Export to Spreadsheet" button was clicked so do whatever you were 
     // doing in the controller action bound to your ActionLink previously 
    } 

    ... 
} 

正如你可以在表單被提交到同一個控制器的動作中,你會明顯得到這兩種情況下看您的視圖模型從表單數據,除此之外,你會知道哪個按鈕被點擊,以採取適當的行動。所以現在你可以擺脫所有你可能寫的花哨的JavaScript和主播。即使用戶禁用了JavaScript,您的應用程序也能正常工作。這是簡單的,簡單的HTML。

注意:請記住,你已經顯示和調用控制器方法在你的問題是不是在ASP.NET MVC的標準。在ASP.NET MVC中,這些方法有名稱。 Tjeir被稱爲控制器操作,並且必須返回ActionResults而不是無效的。您認爲在ASP.NET MVC應用軟件中,您好像使用var grid = new System.Web.UI.WebControls.GridView();

+0

這確實是一個黑客,你會建議什麼? – NealR

+0

使用OpenXML SDK生成Excel文件:http://www.microsoft.com/en-us/download/details.aspx?id = 5124 –

+0

這是我們必須在部署之前在服務器上安裝的東西,還是我只需要在本地計算機上執行一次,然後將其添加到控制器? – NealR