MVC3/EF4.1 Связывание HttppostedFileBase с модели и добавлением в DB
-
25-10-2019 - |
Вопрос
У меня есть действие, которое связывает данные с моделью и добавляет его DB. Теперь то, что я хочу, это иметь загрузчик файла и действие, чтобы сохранить файлы и добавление их имени файла в DB (чтобы я мог отображать файлы/изображения в более поздней точке). Какой лучший подход? Вот что я получил до сих пор (он может хранить файлы, но я не уверен, насколько интеллектуальна 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
быть магазинами в БД. Сначала я, хотя EF просто связывал бы файлы или имена файлов из model.FileUpload
к БД. Но я думаю, что дат данных слишком сложный? Так что я делаю list<HttpPostedFileBase>
и добавление file.FileName
там? Или, может быть, создать совершенно новую сущность/таблицу, где все имена файлов хранятся как строки с помощью эталонного идентификатора? Какие-либо предложения?
Решение
Я не думаю, что вы хотите сохранить фактическое содержимое файла в базе данных. Так что я бы сделал что -то вроде:
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");
- Вам необходимо настроить следующий путь впоследствии, так как ASP.NET не позволит вам обслуживать файлы из папки APP_DATA.
- а
public ICollection<string> Filenames
просто дать вам идею, но вам, вероятно, нужно изменить это вICollection<FileEntity> Files
.