2013-08-06 3 views
2

사용자가 Html.ActionLink을 클릭하면 사용자에게 csv 보고서를 다운로드 할 컨트롤러 메소드를 호출해야합니다. 또한이 컨트롤러에 두 개의 입력란의 값을 전달해야합니다.이 상자는 찾고있는 시작일과 종료일 범위를 나타냅니다.Html.ActionLink를 통해 컨트롤러 메소드에 입력 매개 변수를 전달하십시오.

현재는 Html.ActionLink 매개 변수를 jQuery를 사용하여 할당 할 수 있지만 컨트롤러로 되돌릴 수는 없습니다. 컨트롤러 메서드의 두 매개 변수는 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을 얻기 위해''@ Url.Action ("ExportToCsv", "Agent") ''를 사용 했었지만 이것은 내가 찾고 있던 것과 정확히 일치했다. 고맙습니다! – NealR

+0

다행 당신을 위해 일했다! –

1

양식/제출 방법을 사용할 수 없습니다. 이 특정 양식에 이미 사용되고 있으므로 사용자가 범위의 데이터를 CSV로 내보내기 전에 볼 수 있습니다.

사실 실제로 양식 내에 제출 버튼이 2 개있을 수 있으며 POST 컨트롤러 조치에서 어떤 버튼을 클릭했는지 알 수 있습니다. 그냥 그렇게 : 당신이 양식을 당신은 분명 얻을 것이다 동일한 컨트롤러 액션에 제출 두 경우에서 볼 수 있듯이

[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 
    } 

    ... 
} 

:

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

은 이제 컨트롤러 액션은 btn 인수를 취할 수 양식 데이터에서보기 모델을 선택하고 적절한 조치를 취하기 위해 클릭 한 단추를 알 수 있습니다. 자 이제 ucan은 당신이 작성한 멋진 자바 스크립트와 앵커를 제거합니다. 사용자가 자바 스크립트를 사용하지 않도록 설정 한 경우에도 응용 프로그램이 작동합니다. 그것은 단순하고 단순한 HTML입니다.

참고 : 질문에 표시되는 컨트롤러 메서드은 ASP.NET MVC에서 표준이 아닙니다. ASP.NET MVC에서 이러한 메서드에는 이름이 있습니다. Tjeir은 컨트롤러 작업이라고하며 반드시 void가 아닌 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

관련 문제