MVC错误-处理请求时发生未处理的异常.InvalidOperationException:传递了模型



我在尝试创建产品时遇到以下错误:

处理请求时发生未处理的异常。InvalidOperationException:传递到ViewDataDictionary的类型为"Library.Models.Wine.Product",但ViewDataDictionary实例需要类型为的模型项"Library.ViewModels.ProductViewModel".

我的代码中的问题在哪里?有人知道吗

这是代码:

我的产品服务:

public async Task InsertAsync(Product obj)
{
_context.Add(obj);
await _context.SaveChangesAsync();
}

我的产品视图模型:

public Product products { get; set; }
public virtual ICollection<WineBrand> wine_brands { get; set; }
public virtual ICollection<Harvest> harvests { get; set; }

我的产品管理员:

private readonly ProductService _productService;
private readonly WineBrandService _wineBrandService;
private readonly HarvestService _harvestService;
public ProductsController( 
ProductService productService, 
WineBrandService wineBrandService, 
HarvestService harvestService)
{
_productService = productService;
_wineBrandService = wineBrandService;
_harvestService = harvestService;
}
public async Task<IActionResult> Create()
{
var wine = await _wineBrandService.FindAllAsync();
var year = await _harvestService.FindAllAsync();
var viewmodel = new ProductViewModel 
{ 
wine_brands = wine,
harvests = year
};
return View(viewmodel);
}
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Create(Product product)
{
if (!ModelState.IsValid)
{
return View(product);
}
await _productService.InsertAsync(product);
return RedirectToAction(nameof(Index));
}

我的产品创建视图:

@model Library.ViewModels.ProductViewModel
@{
ViewData["Title"] = "Create";
}
<h1>Create</h1>
<h4>Employee</h4>
<hr />
<div class="row">
<div class="col-md-4">
<form asp-action="Create">
<div asp-validation-summary="ModelOnly" class="text-danger"></div>
<div class="form-group">
<label asp-for="products.Name" class="control-label"></label>
<input asp-for="products.Name" class="form-control" />
<span asp-validation-for="products.Name" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="products.Price" class="control-label"></label>
<input asp-for="products.Price" class="form-control" />
<span asp-validation-for="products.Price" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="products.WineBrandId" class="control-label"></label>
<select asp-for="products.WineBrandId" asp-items="@(new SelectList(Model.wine_brands, "Id", "Name"))" class="form-control"></select>
<span asp-validation-for="products.Brand" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="products.HarvestId" class="control-label"></label>
<select asp-for="products.HarvestId" asp-items="@(new SelectList(Model.harvests, "Id", "Year"))" class="form-control"></select>
<span asp-validation-for="products.Harvest" 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");}
}

您在控制器中应用了[ValidateAntiForgeryToken]令牌,但没有将其设置到视图中。

<form asp-action="Create">
@Html.AntiForgeryToken()
...
...
...

问题是您返回的是Product而不是ProductViewModel。更新下方的Post方法

[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Create(ProductViewModel model)
{
if (!ModelState.IsValid)
{
model.wine_brands = await _wineBrandService.FindAllAsync();
model.harvests = await _harvestService.FindAllAsync();
return View(model);
}
var product = new Product(){
// assign properties form model to new product here
};
await _productService.InsertAsync(product);
return RedirectToAction(nameof(Index));
}

我在所有项目中都遇到了同样的问题,它不适用于你在论坛中找到的任何解决方案。这应该是Visual Studio配置中的一个问题,但我没有找到问题所在,只是找到了这个解决方案。

我的解决方案是从控制台运行dotnet watch run。停止它,然后从Visual Studio 22中作为调试运行,而不重新构建它。它会起作用的。

最新更新