문제

사용자가 "다운로드"버튼을 클릭 할 수있는 옵션이있는 시나리오가 있으며, 이력서 데이터가 포함 된 CSV 파일을 만들어 사용자가 파일을 로컬로 저장할 수 있습니다.전에이 작업을 수행하지 않았 으므로이 작업을 수행하는 방법을 찾기 시작했으며 기본적으로 사용자 정의 뷰 엔진 및 사용자 정의 작업 결과를 모두 나타냅니다.

내 질문은 이제 이들과의 이익 / 단점이란 무엇입니까?선호하는 방법은 무엇입니까?

CSV 파일은 기본적으로 헤더를 포함하고 있으며 데이터 (최대 15 열 / 필드)가 수천 개의 행을 사용합니다.그래서 특별한 것은 없습니다.

도움이 되었습니까?

해결책

Custom Action 결과로 이동합니다 (예제의 실제 직렬화는 FileHelpers )에서 수행됩니다.:

public class CsvResult<T> : ActionResult
{
    public IEnumerable<T> Records { get; private set; }
    public CsvResult(IEnumerable<T> records)
    {
        Records = records;
    }

    public override void ExecuteResult(ControllerContext context)
    {
        var response = context.HttpContext.Response;
        response.ContentType = "text/csv";
        var engine = new FileHelperEngine(typeof(T));
        engine.WriteStream(response.Output, Records);
    }
}

[DelimitedRecord(",")] 
public class Customer 
{
    public int Id { get; set; }
    public string Name { get; set; }         
}

public class HomeController : Controller
{
    public ActionResult Index()
    {
        var customers = new[]
        {
            new Customer { Id = 1, Name = "customer 1" },
            new Customer { Id = 2, Name = "customer 2" },
        };
        return new CsvResult<Customer>(customers);
    }
}
.

확장 방법을 사용 하여이 return 명령문 (제네릭 이이 경우 일반 이며이 경우)을 예측할 수도 있습니다.

public static class ControllerExtensions
{
    public static ActionResult Csv<T>(this Controller controller, IEnumerable<T> records)
    {
        return new CsvResult<T>(records);
    }
}
.

다음 단순히 :

public ActionResult Index()
{
    var customers = new[]
    {
        new Customer { Id = 1, Name = "customer 1" },
        new Customer { Id = 2, Name = "customer 2" },
    };
    return this.Csv(customers);
}
.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top