我正在尝试上传一个 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 文件并保存到数据库。有人有例子吗?
最佳答案
我建议您为此使用自定义模型绑定(bind)器,以避免使用 CSV 解析代码混淆您的 Controller 逻辑:
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()
);
现在我们可以有一个 Controller :
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>
}
关于c# - 带有 ASP.NET MVC 3 的 CSVHelper,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11076587/