2012-06-18 4 views
4

Я пытаюсь загрузить файл csv и реализовать CSVHelper, компетентный с использованием MVC3.CSVHelper с ASP.NET MVC 3

https://github.com/JoshClose/CsvHelper

я не нашел пример использования этого с загрузкой файлов. В принципе, мне нужно взять файл CSV и отобразить объекты сущности и сохранить в БД. Вот мои объекты:

public class SurveyEmailListModels 
    { 
     [Key] 
     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; } 

    } 

Загрузить Handler:

[HttpPost] 
     public ActionResult Upload(HttpPostedFileBase file, SurveyEmailListModels surveyemaillistmodels, int id) 
     { 
      if (file != null && file.ContentLength > 0) 
      { 


       // Collect file and place into directory for source file download 

       var appData = Server.MapPath("~/csv/"); 
       var filename = Path.Combine(appData, Path.GetFileName(file.FileName)); 
       file.SaveAs(filename); 



      // surveyemaillistmodels.SurveyEmailAddress = "[email protected]"; 
      // surveyemaillistmodels.SurveyResponded = true; 
       // surveyemaillistmodels.ProgramId = id; 


       db.SurveyEmailListModels.Add(surveyemaillistmodels); 
       db.SaveChanges(); 

       return Content(filename); 

      } 
      return Json(true); 
     } 

Я не уверен, как цикл через файл CSV и сохранить в БД. Есть ли у кого-нибудь пример?

ответ

2

Я бы порекомендовал вам с помощью пользовательской модели связующего для этой цели, чтобы избежать загромождения логики контроллера с CSV код парсинга:

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(); 
     } 
    } 
} 

, который будет зарегистрирован в Application_Start:

ModelBinders.Binders.Add(
    typeof(SurveyEmailListModels[]), 
    new SurveyEmailListModelsModelBinder() 
); 

И теперь мы могли бы иметь контроллер:

public class HomeController : Controller 
{ 
    public ActionResult Index() 
    { 
     return View(); 
    } 

    [HttpPost] 
    public ActionResult Index(SurveyEmailListModels[] model) 
    { 
     if (!ModelState.IsValid) 
     { 
      return View(); 
     } 

     ... store the model into the database 

     return Content("Thanks for uploading"); 
    } 
} 

и вид:

@Html.ValidationSummary() 
@using (Html.BeginForm(null, null, FormMethod.Post, new { enctype = "multipart/form-data" })) 
{ 
    <input type="file" name="model" /> 
    <button type="submit">OK</button> 
} 
+0

Привет, Дарин, спасибо, что ответили. Я пытаюсь реализовать ваше решение, и я не вижу значения CSV внутри отладчика. Я установил точку останова на «return csvReader.GetRecords», и я не вижу никаких значений. Если посмотреть под местными жителями «CSVReader», я вижу «+ \t \t \t CurrentRecord„csvReader.CurrentRecord“бросил исключение типа \t строки„CsvHelper.CsvReaderException“[] {} CsvHelper.CsvReaderException» – user547794

+0

Вы увидите результаты, если вы помещаете контрольную точку внутри действия вашего контроллера и проверяете переменную модели. Или просто используйте временную переменную внутри связки для модели, прежде чем возвращаться к осмотру. Также убедитесь, что вы прочитали документацию CsvHelpers для правильного использования и ожидаемого формата. Например, ваше свойство SurveyEmailListId не украшено атрибутом '[CsvField (Ignore = true)]', который может вызвать ошибки. Если у вас возникли проблемы с использованием CsvHelpers, запустите новый вопрос, так как это не имеет никакого отношения к ASP.NET MVC. –

+0

ОК, здесь я задал новый вопрос: http://stackoverflow.com/questions/11086942/using-csvhelper-on-file-upload – user547794