我正在尝试上传一个csv文件并使用MVC3实现CSVHelper.
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; } }
上传处理程序:
[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解析代码混乱控制器逻辑:
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> }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。