2012-06-18 28 views
9

Tôi đang cố sử dụng plugin CSVhelper để đọc tệp CSV đã tải lên. Đây là lớp ModelBinder tôi:Sử dụng CSVHelper khi tải lên tệp

public class SurveyEmailListModelsModelBinder : DefaultModelBinder 
{ 
    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
    { 
     var csv = bindingContext.ValueProvider.GetValue(bindingContext.ModelName); 
     var file = ((csv.RawValue as HttpPostedFileBase[]) ?? Enumerable.Empty<HttpPostedFileBase>()).FirstOrDefault(); 

     if (file == null || file.ContentLength < 1) 
     { 
      bindingContext.ModelState.AddModelError(
       "", 
       "Please select a valid CSV file" 
      ); 
      return null; 
     } 

     using (var reader = new StreamReader(file.InputStream)) 
     using (var csvReader = new CsvReader(reader)) 
     { 
      return csvReader.GetRecords<SurveyEmailListModels>().ToArray(); 
     } 
    } 
} 

Đây là những đối tượng tôi đang cố gắng để ánh xạ:

public class SurveyEmailListModels 
{ 
    [Key] 
    [CsvField(Ignore = true)] 
    public int SurveyEmailListId { get; set; } 

    [CsvField(Index = 0)] 
    public int ProgramId { get; set; } 

    [CsvField(Index = 1)] 
    public virtual SurveyProgramModels SurveyProgramModels { get; set; } 

    [CsvField(Index = 2)] 
    public string SurveyEmailAddress { get; set; } 

    [CsvField(Index = 3)] 
    public bool SurveyResponded { get; set; } 

} 

Bên trong debugger Visual Studio Tôi nhận được một lỗi:

  • base {"You must call read on the reader before accessing its data."} CsvHelper.CsvHelperException {CsvHelper.CsvReaderException}

Trả lời

14

Không được sử dụng plugin nhưng thông báo lỗi có vẻ khá rõ ràng. Phải có chức năng Read() để gọi trước khi truy cập kết quả. Hãy thử thay đổi mã của bạn thành một cái gì đó như thế này:

using (var reader = new StreamReader(file.InputStream)) 
using (var csvReader = new CsvReader(reader)) 
{ 
    // Use While(csvReader.Read()); if you want to read all the rows in the records) 
    csvReader.Read(); 
    return csvReader.GetRecords<SurveyEmailListModels>().ToArray(); 
} 
+0

Doh! Điều đó đã làm được điều đó - cảm ơn vì đã giúp đỡ trong khi bộ não của tôi tăng tốc vào sáng nay. – user547794

+0

Không sao cả. Vui mừng được giúp đỡ. –

+0

Nhưng không có cuộc gọi Đọc() nào trong mã của bạn – cyberspy

Các vấn đề liên quan