文件/图像上传后 ASP.NET 3.0 mvc 应用程序崩溃
Posted
技术标签:
【中文标题】文件/图像上传后 ASP.NET 3.0 mvc 应用程序崩溃【英文标题】:ASP.NET 3.0 mvc app crash after file/image upload 【发布时间】:2020-04-23 22:29:27 【问题描述】:我正在使用 ASP.Net Core 3.0,我想创建一个带有图像的新产品,但是在我从文件上传中选择图像并按下“创建”按钮后,我的应用程序崩溃了。我试图在我的控制器上进行调试,但应用程序在到达控制器之前就崩溃了。其他一切都在努力创造行动。当我注释掉文件输入时,其他一切正常。 我只想将图像与我的 ProductModelVM 的其余部分一起发布,以便我可以在我的控制器中处理。
这是我的 ProductPostVM 模型:
using Microsoft.AspNetCore.Http;
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Text.Json.Serialization;
using System.Threading.Tasks;
namespace WebshopAppMVC.Models
public class ProductPostVM
//[JsonPropertyName("id")]
//public int Id get; set;
[Required]
[JsonPropertyName("name")]
public string Name get; set;
[JsonPropertyName("description")]
public string Description get; set;
[Required]
[JsonPropertyName("price")]
public double Price get; set;
[Required]
[JsonPropertyName("manufacturerId")]
// A product has one manufacturer
public int ManufacturerId get; set;
[Required]
[JsonPropertyName("categories")]
// products can have many Categories
public ICollection<int> Categories get; set;
[JsonPropertyName("images")]
// one product can have many images
public IEnumerable<IFormFile> Images get; set;
这是我的 Create.cshtml:
@model WebshopAppMVC.Models.ProductPostVM
@using System.Text.Json;
@using WebshopAppMVC.Models;
@using Microsoft.AspNetCore.Http;
@
ViewData["Title"] = "Create";
List<ManufacturerVM> manufacturers = JsonSerializer.Deserialize<List<ManufacturerVM>>(@Context.Session.GetString("manufacturers"));
SelectList manufacturersData = new SelectList(manufacturers, "Id", "Name");
List<CategoryVM> categories = JsonSerializer.Deserialize<List<CategoryVM>>(@Context.Session.GetString("categories"));
<h1>Create</h1>
<h4>ProductPostVM</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="Id" class="control-label"></label>
<input asp-for="Id" class="form-control" />
<span asp-validation-for="Id" class="text-danger"></span>*@
@*</div>*@
<div class="form-group">
<label asp-for="Name" class="control-label"></label>
<input asp-for="Name" class="form-control" />
<span asp-validation-for="Name" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="Description" class="control-label"></label>
<input asp-for="Description" class="form-control" />
<span asp-validation-for="Description" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="Price" class="control-label"></label>
<input asp-for="Price" class="form-control" />
<span asp-validation-for="Price" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="ManufacturerId" class="control-label"></label>
<select asp-for="ManufacturerId" class="form-control" asp-items=@manufacturersData>
<option value="">Please select</option>
</select>
<span asp-validation-for="ManufacturerId" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="Categories" class="control-label"></label>
<div class="col-md-offset-2 col-md-10">
<table>
<tr>
@
int cnt = 0;
foreach (var category in categories)
if (cnt++ % 3 == 0)
@:</tr><tr>
@:<td>
<input type="checkbox"
name="Categories"
value="@category.Id"
@(Html.Raw(category.Assigned ? "checked=\"checked\"" : "")) />
@category.Name
@:</td>
@:</tr>
</table>
</div>
</div>
<div class="form-group">
<dl>
<dt>
<label asp-for="Images"></label>
</dt>
<dd>
<input asp-for="Images" type="file" multiple>
</dd>
</dl>
</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>
这是我的控制器中用于创建操作的代码:
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Create(ProductPostVM productPost)
if (ModelState.IsValid)
//foreach (string file in Request.)
//
// var postedFile = Request.Files[file];
// postedFile.SaveAs(Server.MapPath("~/UploadedFiles/") + Path.GetFileName(postedFile.FileName));
//
var client = _httpClientFactory.CreateClient();
var productContent = new StringContent(JsonSerializer.Serialize(productPost), Encoding.UTF8, "application/json");
HttpResponseMessage httpResponseMessage = await client.PostAsync(new Uri("https://localhost:44352/api/products"), productContent).ConfigureAwait(false);
if (httpResponseMessage.IsSuccessStatusCode)
return RedirectToAction(nameof(Index));
return View(productPost);
这是我的视图的图片:
【问题讨论】:
运行程序时使用的是哪个浏览器? 我正在使用勇敢,因为你的问题,我在 chrome 中尝试过它并且它有效!所以我想我再也不会使用勇敢了;)谢谢你的帮助! 【参考方案1】:这种行为具体归因于浏览器问题,而不是一般Visual Studio
。根据这个article 和这个article,在这种情况下使用Brave
和Yandex
等浏览器时通常会观察到这种行为。有时甚至Chrome
也会出现这种行为,但并不一致(至少我观察到的是这样)。
一种可能的解决方案是更改您的浏览器类型以使用理想的浏览器,例如 Chrome、Firefox 或 Edge。
对于使用Brave
浏览器的用户,另一种选择是:
关闭(关闭)防护罩可停止崩溃。你可以这样做 点击 URL 右侧的盾牌图标。
【讨论】:
Brave 遇到了这个问题。希望有一种方法可以在某处捕获异常,但没有运气。切换到 Firefox 进行测试确实对我有用。谢谢【参考方案2】:您的<form>
标签使用了错误的方法属性。 method="get"
是default value。
试试
<form asp-action="Create" enctype="multipart/form-data" method="post">
【讨论】:
这仍然对我不起作用,没有区别,当我转到 Visual Studio 的 bebug 输出时,它说:程序“[18948] iisexpress.exe:程序跟踪”已退出,代码为 0 (0x0)。程序“[18948] iisexpress.exe”已退出,代码为 -1 (0xffffffff)。 您可能需要清除缓存或使用开发者工具来确保新的更改得到反映。以上是关于文件/图像上传后 ASP.NET 3.0 mvc 应用程序崩溃的主要内容,如果未能解决你的问题,请参考以下文章
是否有适用于 Azure 的 c#/asp.net mvc3 文件图像选择器/上传器控件