Использование CSVHelper при загрузке файлов
Я пытаюсь использовать плагин CSVhelper для чтения загруженного CSV-файла. Вот мой класс modelBinder:
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();
}
}
}
Вот объекты, которые я пытаюсь сопоставить:
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; }
}
Внутри отладчика Visual Studio я получаю ошибку:
base {"You must call read on the reader before accessing its data."} CsvHelper.CsvHelperException {CsvHelper.CsvReaderException}
1 ответ:
Не использовал плагин, но сообщение об ошибке кажется довольно ясным. Перед получением доступа к результатам должна быть вызвана функция
Read()
. Попробуйте изменить код примерно так: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(); }