Загрузка изображений галереи с использованием файловой системы в Entity Framework - PullRequest
0 голосов
/ 19 апреля 2020

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

public IEnumerable<string> GalleryImages { get; set; } 

к своему ProductModel, построил решение и выполнил update-database в консоли диспетчера пакетов. Но свойство не добавляется в таблицу Product, и когда я пытаюсь добавить и затем редактировать продукт, я получаю эту ошибку:

System.ArgumentNullException: «Значение не может быть нулевым. Имя параметра: источник '

Кроме того, я добавил этот фрагмент кода в Edit.cshtl:

@if (!Model.GalleryImages.Any())
{
    <h4>There are no gallery images for this product.</h4>
}

<form action="/AdminPanel/Product/SaveGalleryImages" method="post" enctype="multipart/form-data" class="dropzone" id="dropzoneForm">
    <div class="fallback">
        <input type="file" name="file" multiple />
        <input type="submit" value="Upload" />
    </div>
</form>

<br /><br />

@foreach (var image in Model.GalleryImages)
{
    <div style="display: inline-block">
        <img src="/Images/Uploads/Products/@Model.Id/Gallery/Thumbs/@image" />
        @Html.ActionLink("delete", "DeleteImage", "Product", new { @class = "deleteimage", data_name = image })
    </div>
}
<link href="~/Scripts/dropzone/basic.css" rel="stylesheet" />
<link href="~/Scripts/dropzone/dropzone.css" rel="stylesheet" />

@section Scripts{
    <script src="~/Scripts/dropzone/dropzone.js"></script>

    <script>
    $(function () {
        //preview image
        function readURL(input) {
            if (input.files && input.files[0]) {
                var reader = new FileReader();

                reader.onload = function (e) {
                    $("img#imgpreview").attr("src", e.target.result).width(200).height(200);
                }
                reader.readAsDataURL(input.files[0]);
            }
        }
        $("#ImageUpload").change(function () {
            readURL(this);
        });

        //dropzone js

        Dropzone.options.dropzoneForm = {
            acceptedFiles: "image/*",
            init: function () {
                this.on("complete", function (file) {
                    if (this.getUploadingFiles().length === 0 && this.getQueuedFiles().length === 0) {
                        location.reload();
                    }
                });

                this.on("sending", function (file, xhr, formData) {
                    formData.append("id", @Model.Id);
                });
            }
        };

        //dropzone js
        $("a.deleteimage").click(function (e) {
            e.preventDefault();

            if (!confirm("confirm deletion"))
                return false;

            var $this = $(this);
            var url = "/admin/shop/DeleteImage";
            var imageName = $this.data("name");

            $.post(url, { id: @Model.Id, imageName: imageName }, function (data) {
                $this.parent().fadeOut("fast");
            });
        });
    });
    </script>
}

1 Ответ

0 голосов
/ 19 апреля 2020

ОБНОВЛЕНИЕ:

Что именно вы ожидаете в качестве типа данных столбца при моделировании его как List<string>? SQL Сервер не имеет какого-либо типа данных столбца для обработки произвольного списка строк ....

Если у вас есть отношение 1: n между ProductModel и изображениями галереи, у вас действительно должен быть отдельный класс модели, который содержит информацию об изображении - например, MyImages. Затем вы можете добавить свойство стиля коллекции

public virtual ICollection<MyImages> GalleryImages 

к вашему ProductModel классу.

SQL Сервер не может реально обработать List<string> как тип столбца .....


Для этого необходимо выполнить следующие шаги:

  1. Измените свой C# класс модели (вы уже сделали это)
  2. Запустите add-migration migration-name, чтобы в ваш проект был добавлен перенос EF (вы, кажется, пропустили этот шаг)
  3. Запустите update-database, чтобы фактически применить эту миграцию к базе данных.

Только если вы выполнили ВСЕ 3 шага именно в этом порядке, это изменения из вашего C# класс модели фактически применяется к базе данных - вы НЕ МОЖЕТЕ просто пропустить шаг № 2 ....

...