我有一个ActionResult,它将数据绑定到模型并将其添加到数据库中。现在我想要的是拥有一个文件上传器和ActionResult来存储文件并将它们的FileName添加到数据库中(所以我可以在以后显示文件/图像)。什么是最好的方法?这是我到目前为止所得到的(它可以存储文件,但我不确定EF是多么智能,以及数据类型有多复杂):
模型类:
public class Annonce
{
public int Id { get; set; }
public string Company { get; set; }
public string Size { get; set; }
public IEnumerable<HttpPostedFileBase> FileUpload { get; set; }
}
视图(使用mircosoft.web.helpers):
@using (Html.BeginForm("Create", "Annonce", FormMethod.Post, new { enctype = "multipart/form-data" }))
{
@Html.ValidationSummary(true)
<fieldset>
<legend>Annonce</legend>
<div class="editor-label">
@Html.LabelFor(model => model.Company)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Company)
@Html.ValidationMessageFor(model => model.Company)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.Size)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Size)
@Html.ValidationMessageFor(model => model.Size)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.FileUpload)
</div>
<div class="editor-field">
@FileUpload.GetHtml(uploadText: "Opret")
</div>
</fieldset>
控制器:
[HttpPost]
public ActionResult Create(Annonce annonce)
{
if (ModelState.IsValid)
{
//System.IO stuff
foreach (var file in annonce.FileUpload)
{
if (file.ContentLength > 0)
{
var fileName = Path.GetFileName(file.FileName);
var path = Path.Combine(Server.MapPath("~/App_Data/uploads"), fileName);
file.SaveAs(path);
}
}
//Database stuff
db.Annoncer.Add(annonce);
db.SaveChanges();
return RedirectToAction("Index");
}
return View(annonce);
}
这样可以很好地存储文件。现在我想要的是file.FileName
是db中的存储。起初,我虽然EF只是将文件或文件名从model.FileUpload
绑定到数据库。但我猜数据类型太复杂了?所以我虽然制作了list<HttpPostedFileBase>
并在那里添加了file.FileName
?或者也许创建一个全新的实体/表,其中所有文件名都存储为带引用ID的字符串?
有什么建议吗?
答案 0 :(得分:1)
我认为您不想将实际文件内容保存在数据库中。 所以我会做类似的事情:
public class AnnonceFile
{
public string filename {get;set;}
}
public class Annonce
{
public int Id { get; set; }
public string Company { get; set; }
public string Size { get; set; }
public ICollection<AnnonceFile> Filenames{ get; set; }
}
//System.IO stuff
foreach (var file in files)
{
if (file.ContentLength > 0)
{
var fileName = Path.GetFileName(file.FileName);
var path = Path.Combine(Server.MapPath("~/App_Data/uploads"), fileName);
file.SaveAs(path);
annonce.Filenames.Add( new AnnonceFile {filename = path});
}
}
//Database stuff
db.Annoncer.Add(annonce);
db.SaveChanges();
return RedirectToAction("Index");
public ICollection<string> Filenames
只是为了给您一个想法,但您可能需要在ICollection<FileEntity> Files
中进行更改。