データをモデルにバインドし、DB に追加する ActionResult があります。今私が欲しいのは、ファイルアップローダーと、ファイルを保存し、それらの FileName を DB に追加するための ActionResult を用意することです (後でファイル/画像を表示できるようにします)。最善のアプローチは何ですか?これまでに得たものは次のとおりです(ファイルを保存できますが、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
db にバインドすると思っていました。しかし、データ型が複雑すぎると思いますか? それで、私は を作成してそこにlist<HttpPostedFileBase>
追加することをfile.FileName
考えましたか?または、すべてのファイル名が参照 ID 付きの文字列として格納されている新しいエンティティ/テーブル全体を作成することはできますか? 助言がありますか?