【发布时间】:2022-12-18 16:54:17
【问题描述】:
我一直尝试在 asp.net core 中上传图片,但无论我怎么做,我都会遇到同样的问题。 ModelState.IsValid 返回错误。我最终屈服了,只是复制并粘贴了别人的作品,希望如果我能让它发挥作用,即使它是别人的,我也能明白我哪里出错了。即使使用我的脚本小子技术,我的计划也被挫败了。所以现在我遇到了比以往任何时候都更聪明的人。
这是我复制的教程from
我的模型看起来像这样:
using Microsoft.EntityFrameworkCore.Metadata.Internal;
using System.ComponentModel.DataAnnotations.Schema;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
public class ImageModel
{
[Key]
public int ImageId { get; set; }
[Column(TypeName = "nvarchar(50)")]
public string Title { get; set; }
[Column(TypeName = "nvarchar(100)")]
[DisplayName("Image Name")]
public string ImageName { get; set; }
[NotMapped]
[DisplayName("Upload File")]
public IFormFile ImageFile { get; set; }
}
我的控制器的相关部分
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Create([Bind("ImageId,Title,ImageFile")] ImageModel imageModel)
{
var errors = ModelState.Values.SelectMany(v => v.Errors);
if (ModelState.IsValid)
{
// Save image to wwwroot/image
string wwwRootPath = _hostEnvironment.WebRootPath;
string fileName = Path.GetFileNameWithoutExtension(imageModel.ImageFile.FileName);
string extension = Path.GetExtension(imageModel.ImageFile.FileName);
imageModel.ImageName = fileName = fileName + DateTime.Now.ToString("yymmssfff") + extension;
string path = Path.Combine(wwwRootPath + "/Image/", fileName);
using (var fileStream = new FileStream(path, FileMode.Create))
{
await imageModel.ImageFile.CopyToAsync(fileStream);
}
// Insert record
_context.Add(imageModel);
await _context.SaveChangesAsync();
return RedirectToAction(nameof(Index));
}
return View(imageModel);
}
最后是视图
@model ImageModel
@{
ViewData["Title"] = "Create";
}
<h1>Create</h1>
<h4>ImageModel</h4>
<hr />
<div class="row">
<div class="col-md-4">
<form asp-action="Create" enctype="multipart/form-data">
<div asp-validation-summary="ModelOnly" class="text-danger"></div>
<div class="form-group">
<label asp-for="Title" class="control-label"></label>
<input asp-for="Title" class="form-control" />
<span asp-validation-for="Title" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="ImageFile" class="control-label"></label>
<input asp-for="ImageFile" accept="image/*" />
<span asp-validation-for="ImageFile" class="text-danger"></span>
</div>
<div class="form-group">
<input type="submit" value="Create" class="btn btn-primary" />
</div>
</form>
</div>
</div>
<div>
<a asp-action="Index">Back to List</a>
</div>
@section Scripts {
@{
await Html.RenderPartialAsync("_ValidationScriptsPartial");
}
}
我看了一下这个question 并听从了建议。它返回的错误是
ModelError、ModelError.Exception、ModelError.ErrorMessage Microsoft.AspNetCore.Mvc.ModelBinding.ModelError
图片名称字段是必需的感谢您的时间
【问题讨论】:
-
也许如果您将
[Bind("ImageId,Title,ImageFile")]替换为[FromForm]。
标签: c# asp.net-core-mvc