2012-06-18 7 views
4

CSV 파일을 업로드하고 MVC3을 사용하여 CSVHelper를 구현하려고합니다.ASP.NET MVC 3 CSVHelper

https://github.com/JoshClose/CsvHelper

나는 파일 업로드로 이것을 사용하는 예제를 발견하지 않았습니다. 기본적으로 CSV 파일을 가져와 엔티티 개체에 매핑하고 DB에 저장해야합니다.

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

    } 

업로드 처리기 : 여기 내 실체가

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

잘 모르겠어요 어떻게 DB에 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"지역 주민에서 보면, 나는 – user547794

+0

당신은 결과의 경우를 볼 것이다 "+ \t \t CurrentRecord \t 'csvReader.CurrentRecord는'[] {CsvHelper.CsvReaderException가} 'CsvHelper.CsvReaderException'\t 문자열 유형의 예외가 발생했습니다"참조 컨트롤러 액션 내부에 중단 점을 넣고 모델 변수를 검사합니다. 또는 검사를 위해 돌아 오기 전에 모델 바인더 내에서 임시 변수를 사용하기 만하면됩니다. 또한 CsvHelpers 문서에서 올바른 사용법과 예상 형식을 읽었는지 확인하십시오. 예를 들어 SurveyEmailListId 속성은 오류를 유발할 수있는'[CsvField (Ignore = true)] 속성으로 장식되어 있지 않습니다. CsvHelpers를 사용하는 데 문제가 있으면 ASP.NET MVC와 관련이 없기 때문에 새로운 질문을 시작하십시오. –

+0

좋아요, 새 질문을 여기에서 시작했습니다 : http://stackoverflow.com/questions/11086942/using-csvhelper-on-file-upload – user547794