MVC3 / EF4.1 Binding HttpPostedFileBase il modello e l'aggiunta di DB
-
25-10-2019 - |
Domanda
Ho un ActionResult che lega i dati al modello e lo aggiunge il DB. Ora quello che voglio, è quello di avere un file uploader, e l'ActionResult per memorizzare i file e aggiungendo loro nome al DB (in modo da poter visualizzare i file / immagini in un secondo momento). Qual è l'approccio migliore? Ecco quello che ho ottenuto finora (E 'possibile memorizzare i file, ma non sono sicuro di come intelligente EF è, e come complesso i tipi di dati può essere):
La classe del modello:
public class Annonce
{
public int Id { get; set; }
public string Company { get; set; }
public string Size { get; set; }
public IEnumerable<HttpPostedFileBase> FileUpload { get; set; }
}
La vista (utilizzando 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>
Il controller:
[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);
}
Questa memorizza i file più che bene. Ora quello che voglio, è file.FileName
essere negozi nel db. In un primo momento, ho pensato EF sarebbe semplicemente legano i file o nomi di file dal model.FileUpload
al db. Ma credo che il tipo di dati è troppo complesso? Così ho pensato di fare un list<HttpPostedFileBase>
e aggiungendo la file.FileName
lì? O forse creare un intero un'entità nuova / tavolo dove tutti i nomi dei file sono memorizzati come stringhe con un riferimento-Id?
Qualche suggerimento?
Soluzione
Non credo che si desidera salvare il contenuto del file effettivi del database. Quindi mi sento di fare qualcosa di simile:
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");
- È necessario modificare il percorso salvato in seguito, dal momento che asp.net non permetterà di servire i file dalla cartella App_Data.
- il
public ICollection<string> Filenames
è solo per darvi un'idea, ma probabilmente ha bisogno di cambiamento che inICollection<FileEntity> Files
.