質問

データをモデルにバインドし、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");  
  1. ASP.NETはAPP_DATAフォルダーからファイルを提供することができないため、後に保存されたパスを調整する必要があります。
  2. public ICollection<string> Filenames あなたにアイデアを与えるためだけですが、おそらくそれを変更する必要があります ICollection<FileEntity> Files.
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top