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
DBの店舗になる。最初は、EFは単にファイルまたはファイル名をからバインドするだけです model.FileUpload
DBへ。しかし、データ型は複雑すぎると思いますか?だから私はaを作るのです list<HttpPostedFileBase>
そして追加します file.FileName
そこの?または、すべてのファイル名が参照IDを持つ文字列として保存されるまったく新しいエンティティ/テーブルを作成するかもしれません。助言がありますか?
解決
データベースに実際のファイルコンテンツを保存したいとは思わない。だから私は次のようなことをします:
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
.
所属していません StackOverflow