Почему мое изображение не будет сохранено в моей базе данных? - PullRequest
0 голосов
/ 19 апреля 2020

Я создаю приложение ASP. NET MVC и пытаюсь сохранить в своей базе данных изображение, которое будет прикреплено к автомобилю, чтобы я мог отобразить его позже. Когда я запускаю свой код, я могу создать новый автомобиль и сохранить изображение в папке, но в базу данных для таблицы изображений не добавляется информация.

Это мой контроллер:

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create(HttpPostedFileBase[] files, [Bind(Include = "CarID,Year,Color,Mileage,Cost,MarketValue,BodyType,Drive,Notes,Available,VinNumber,CarLotID,ModelID")] Car car)
{
        if (ModelState.IsValid)
        {
            foreach (HttpPostedFileBase file in files)
            {
                //Checking file is available to save.  
                if (file != null)
                {
                    var InputFileName = Path.GetFileName(file.FileName);
                    var ServerSavePath = Path.Combine(Server.MapPath("~/CarImages/") + InputFileName);
                    //Save file to server folder  
                    file.SaveAs(ServerSavePath);

                    var image = new Image()
                    {
                        ImagePath = ServerSavePath,
                        Title = ServerSavePath
                    };

                    car.Images.Add(image);
                    //assigning file uploaded status to ViewBag for showing message to user.  
                    ViewBag.UploadStatus = files.Count().ToString() + " files uploaded successfully.";
                }
            }

            db.Cars.Add(car);
            db.SaveChanges();

            return RedirectToAction("Index");
        }

        ViewBag.MakeID = new SelectList(db.Makes, "MakeID", "Name", car.Model?.MakeID);
        ViewBag.ModelID = new SelectList(db.Models, "ModelID", "Name", car.ModelID);
        ViewBag.CarLotID = new SelectList(db.CarLots, "CarLotID", "LotName", car.CarLotID);
        return View(car);
}

Это мой модельный класс для Image:

public partial class Image
{
    public int ImageID { get; set; }
    public int CarID { get; set; }
    public string Title { get; set; }
    public string ImagePath { get; set; }
    public HttpPostedFileBase ImageFile { get; set; }    
    public virtual Car Car { get; set; }
}

Это мой модельный класс для Car:

using System;
using System.Collections.Generic;
using System.ComponentModel;

public partial class Car
{
    public int CarID { get; set; }
    public string Year { get; set; }
    public string Color { get; set; }
    public string Mileage { get; set; }
    public decimal Cost { get; set; }
    public string BodyType { get; set; }
    public string Drive { get; set; }
    public string Notes { get; set; }
    public bool Available { get; set; }
    public string VinNumber { get; set; } 
    public int CarLotID { get; set; }
    public int ModelID { get; set; }
    public virtual ICollection<Image> Images { get; set; }
    public virtual CarLot CarLot { get; set; }
    public HttpPostedFileBase[] files { get; set; }
}

Это мой вид

@model IgnitionHub2._0.Models.Car
@using IgnitionHub2._0.Models

@{
    ViewBag.Title = "Create";
    Layout = "~/Views/Shared/_Layout.cshtml";
}

<h2>Create</h2>

@using (Html.BeginForm("Create", "Car", FormMethod.Post, new { enctype = "multipart/form-data" }))
{
    @Html.AntiForgeryToken()

<div class="form-horizontal">
    <h4>Car</h4>
    <hr />
    @Html.ValidationSummary(true, "", new { @class = "text-danger" })
    <div class="form-group">
        @Html.LabelFor(model => model.Year, htmlAttributes: new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.EditorFor(model => model.Year, new { htmlAttributes = new { @class = "form-control" } })
            @Html.ValidationMessageFor(model => model.Year, "", new { @class = "text-danger" })
        </div>
    </div>
    <div class="form-group">
        @Html.LabelFor(model => model.files, "Add an Image", htmlAttributes: new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.TextBoxFor(model => model.files, "", new { @type = "file", @multiple = "multiple" })
            @Html.ValidationMessageFor(model => model.files, "", new { @class = "text-danger" })
        </div>
    </div>

    <div class="form-group">
        <div class="col-md-offset-2 col-md-10">
            <input type="submit" value="Create" class="btn btn-default" />
        </div>
    </div>
</div>
}

Я удалил большинство выпадающих списков для представления сообщения, чтобы оно не было слишком длинным.

Пожалуйста, помогите! Спасибо!

Ответы [ 2 ]

2 голосов
/ 20 апреля 2020

Вот рабочая демонстрация, как показано ниже:

Модель:

public partial class Car
{
    public Car()
    {
        Images = new List<Image>() { };
    }
    public int CarID { get; set; }
    public string Year { get; set; }
    public string Color { get; set; }
    public string Mileage { get; set; }
    public decimal Cost { get; set; }
    public string BodyType { get; set; }
    public string Drive { get; set; }
    public string Notes { get; set; }
    public bool Available { get; set; }
    public string VinNumber { get; set; }
    public int CarLotID { get; set; }
    public int ModelID { get; set; }
    public virtual List<Image> Images { get; set; }
    public HttpPostedFileBase[] files { get; set; }
}
public partial class Image
{
    public int ImageID { get; set; }
    public int CarID { get; set; }
    public string Title { get; set; }
    public string ImagePath { get; set; }
    public virtual Car Car { get; set; }
    public HttpPostedFileBase[] files { get; set; } 

}

Вид:

@model  Car
@using WebApplication2.Models

<h2>Create</h2>

@using (Html.BeginForm("Create", "Cars", FormMethod.Post, new { enctype = "multipart/form-data" }))
{
    @Html.AntiForgeryToken()

    <div class="form-horizontal">
        <h4>Car</h4>
        <hr />
        @Html.ValidationSummary(true, "", new { @class = "text-danger" })
        <div class="form-group">
            @Html.LabelFor(model => model.Year, htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.EditorFor(model => model.Year, new { htmlAttributes = new { @class = "form-control" } })
                @Html.ValidationMessageFor(model => model.Year, "", new { @class = "text-danger" })
            </div>
        </div>
        <div class="form-group">
            @Html.LabelFor(model => model.files, "Add an Image", htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.TextBoxFor(model => model.files, "", new { @type = "file", @multiple = "multiple" })
                @Html.ValidationMessageFor(model => model.files, "", new { @class = "text-danger" })
            </div>
        </div>

        <div class="form-group">
            <div class="col-md-offset-2 col-md-10">
                <input type="submit" value="Create" class="btn btn-default" />
            </div>
        </div>
    </div>
}

Контроллер:

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create(HttpPostedFileBase[] files,  Car car)
{
    if (ModelState.IsValid)
    {
        foreach (HttpPostedFileBase file in  files)
        {
            //Checking file is available to save.  
            if (file != null)
            {
                var InputFileName = Path.GetFileName(file.FileName);
                var ServerSavePath = Path.Combine(Server.MapPath("~/CarImages/") , InputFileName);
                //Save file to server folder  
                file.SaveAs(ServerSavePath);

                var image = new Image()
                {
                    ImagePath = ServerSavePath,
                    Title = ServerSavePath
                };

                //db.Images.Add(image);
                //  db.SaveChanges();
                car.Images.Add(image);
                //assigning file uploaded status to ViewBag for showing message to user.  
                ViewBag.UploadStatus = files.Count().ToString() + " files uploaded successfully.";
            }
        }

        db.Cars.Add(car);
        db.SaveChanges();

        return RedirectToAction("Index");
    }

    return View(car);
}

Результат:

enter image description here

2 голосов
/ 20 апреля 2020

Если вы собираетесь хранить изображение в каталоге, просто сохраните путь к изображению в базе данных. Чтобы сохранить изображение в двоичной базе данных, ваша модель / сущность изображения должна быть следующей.

Чтобы сохранить изображение в двоичной базе данных, ваша модель изображения должна быть следующей. Вы должны перевести изображение, которое вы получили в элементе управления, в байтовый массив и присвоить его переменной ImageFile.

Изменить контроллер:

MemoryStream target = new MemoryStream();
file.InputStream.CopyTo(target);
byte[] data = target.ToArray();
image.ImageFile  = data
car.Images.Add(image);

Ваша модель:

public partial class Image
{
    public int ImageID { get; set; }
    public int CarID { get; set; }
    public string Title { get; set; }
    public string ImagePath { get; set; }
    public byte[] ImageFile { get; set; }    
    public virtual Car Car { get; set; }
}
...