在 Entity Framework 中使用文件系统上传图库图片
Uploading gallery images using filesystem in Entity Framework
我想使用文件系统上传将图库图像上传到 ASP.NET MVC 5 应用程序。我添加了
public IEnumerable<string> GalleryImages { get; set; }
到我的 ProductModel
,构建解决方案并在程序包管理器控制台中执行 update-database
。但是,属性 没有添加到 Product
table 中,当我尝试添加然后编辑产品时,出现此错误:
System.ArgumentNullException: 'Value cannot be null.
Parameter name: source'
此外,我将这段代码添加到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>
}
更新:
当您将列数据类型建模为 List<string>
时,您究竟希望列数据类型是什么? SQL 服务器没有任何列数据类型来处理任意字符串列表....
如果您在 ProductModel
和图库图像之间存在 1:n 关系,那么您确实应该有一个 separate 模型 class图像信息 - 例如MyImages
。然后你可以添加一个集合样式 属性
public virtual ICollection<MyImages> GalleryImages
你的 ProductModel
class。
SQL 服务器无法真正处理 List<string>
作为列类型.....
完成此操作所需的步骤是:
- 更改您的 C# 模型class(您已经这样做了)
- 运行
add-migration migration-name
以便将 EF 迁移添加到您的项目中(您似乎跳过了这一步)
- 运行
update-database
实际将该迁移应用到数据库。
只有当您完全按照此顺序完成 所有 3 个步骤 时,您的 C# 模型 class 的更改才会实际应用于数据库 - 您 CANNOT 只需跳过步骤 #2 ....
我想使用文件系统上传将图库图像上传到 ASP.NET MVC 5 应用程序。我添加了
public IEnumerable<string> GalleryImages { get; set; }
到我的 ProductModel
,构建解决方案并在程序包管理器控制台中执行 update-database
。但是,属性 没有添加到 Product
table 中,当我尝试添加然后编辑产品时,出现此错误:
System.ArgumentNullException: 'Value cannot be null. Parameter name: source'
此外,我将这段代码添加到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>
}
更新:
当您将列数据类型建模为 List<string>
时,您究竟希望列数据类型是什么? SQL 服务器没有任何列数据类型来处理任意字符串列表....
如果您在 ProductModel
和图库图像之间存在 1:n 关系,那么您确实应该有一个 separate 模型 class图像信息 - 例如MyImages
。然后你可以添加一个集合样式 属性
public virtual ICollection<MyImages> GalleryImages
你的 ProductModel
class。
SQL 服务器无法真正处理 List<string>
作为列类型.....
完成此操作所需的步骤是:
- 更改您的 C# 模型class(您已经这样做了)
- 运行
add-migration migration-name
以便将 EF 迁移添加到您的项目中(您似乎跳过了这一步) - 运行
update-database
实际将该迁移应用到数据库。
只有当您完全按照此顺序完成 所有 3 个步骤 时,您的 C# 模型 class 的更改才会实际应用于数据库 - 您 CANNOT 只需跳过步骤 #2 ....