【发布时间】:2021-10-25 04:57:11
【问题描述】:
为了对“创建”页面进行特定验证,我构建了一个 viewModel。但是当我提交表单时,我收到以下错误:
" InvalidOperationException:传递到 ViewDataDictionary 的模型项的类型为“AURA.Models.PostFou”,但此 ViewDataDictionary 实例需要一个“AURA.ViewModels.JobAddressVM”类型的模型项。 "
模型“PostFou”在这里是相关的,但我完全没有引用它,我可以说。它只在提交时发生。
控制器:
public IActionResult JobAddress()
{
//viewmodel?
return View();
}
[HttpPost]
public async Task<IActionResult> JobAddress([Bind("FouName,FouPhon,FouEmai,FouAddr,FouPost,FouOrg")] PostZero postZero, PostOne postOne, PostFou postFou)
{
if (ModelState.IsValid)
{
//add post zero first
postZero.ZeroDate = DateTime.Now;
string uDate = DateTime.Now.ToString("yyMMdd");
string uDigit = _context.PostZeros.Count(d => d.ZeroDate.Date == postZero.ZeroDate.Date).ToString(); //awesome
postZero.Zero = uDate + "-" + uDigit;
postZero.ZeroAgen = User.Identity.Name;
_context.Add(postZero);
await _context.SaveChangesAsync();
//now the postone
postOne.OneStag = "MSR";
postOne.OneZero = postZero.Zero;
postOne.OneAgen = User.Identity.Name;
postOne.OnePart = postFou.FouPhon;
postOne.OneTitl = "T--" + postFou.FouName + "--" + DateTime.Now.ToShortDateString();
postOne.OneType = "MSR";
_context.Add(postOne);
await _context.SaveChangesAsync();
//now for posteig load
PostEig postEig = new PostEig();
postEig.EigZero = postZero.Zero;
postEig.EigAgen = "CLIENT";
postEig.EigRole = "SALE";
postEig.EigLoad = 0;
_context.Add(postEig);
await _context.SaveChangesAsync();
//POSTFOU
postFou.FouZero = postZero.Zero;
_context.Add(postFou);
await _context.SaveChangesAsync();
return RedirectToAction(nameof(PriceShip), new { zero = postOne.OneZero });
}
return View(postFou);
}
并查看:
@model AURA.ViewModels.JobAddressVM
@{ ViewData["Title"] = "Job Address"; }
<h4>Job and Address</h4>
<hr />
<div class="row">
<div class="col-md-4">
<form asp-action="JobAddress">
<div asp-validation-summary="ModelOnly" class="text-danger"></div>
<div class="form-group">
<label asp-for="FouName" class="control-label"></label>
<input asp-for="FouName" class="form-control" />
<span asp-validation-for="FouName" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="FouPhon" class="control-label"></label>
<input asp-for="FouPhon" class="form-control" />
<span asp-validation-for="FouPhon" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="FouEmai" class="control-label"></label>
<input asp-for="FouEmai" class="form-control" />
<span asp-validation-for="FouEmai" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="FouAddr" class="control-label"></label>
<input asp-for="FouAddr" class="form-control" />
<span asp-validation-for="FouAddr" class="text-danger"></span>
</div>
<div class="form-group">
<label class="control-label">Apt No</label>
<input asp-for="FouOrg" class="form-control" />
<span asp-validation-for="FouOrg" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="FouPost" class="control-label"></label>
<input asp-for="FouPost" class="form-control" />
<span asp-validation-for="FouPost" class="text-danger"></span>
</div>
<div class="form-group">
<input type="submit" value="To Manifest" class="btn btn-primary" />
</div>
</form>
</div>
</div>
@section Scripts {
@{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
}
和 ViewModel:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace AURA.ViewModels
{
public class JobAddressVM
{
//fou
//[Key]
[Display(Name = "Full Name")]
[RegularExpression(@"[a-zA-Z0-9""'\s-|\.\=\+\*\/\\]*$")]
[StringLength(45)]
public string FouName { get; set; }
[Display(Name = "Phone")]
[StringLength(10, ErrorMessage = "10 Digits only!")]
//[DataType(DataType.PhoneNumber)]
[RegularExpression(@"^[0-9\s]{1,40}$",
ErrorMessage = "Characters are not allowed.")]
public string FouPhon { get; set; }
[Display(Name = "Email")]
[DataType(DataType.EmailAddress)]
[StringLength(45)]
public string FouEmai { get; set; }
[Display(Name = "Street Address")]
[RegularExpression(@"[a-zA-Z0-9""'\s-|\.\=\+\*\/\\]*$")]
[StringLength(60)]
public string FouAddr { get; set; }
[Display(Name = "Apt/Unit")]
[RegularExpression(@"[a-zA-Z0-9""'\s-|\.\=\+\*\/\\]*$")]
[StringLength(45)]
public string FouOrg { get; set; }
[Display(Name = "Postal Code")]
[RegularExpression(@"[a-zA-Z0-9""'\s-|\.\=\+\*\/\\]*$")]
[StringLength(10)]
public string FouPost { get; set; }
}
}
【问题讨论】:
-
行return View(postFou);肯定会返回 PostFou 类型的类,并且视图不期望这种类型,因此会出现错误。
-
@Esko 发帖并赢得胜利
-
@NickFleetwood 解决方案有什么运气吗?我在将值从 VM 传递到视图时遇到相同的问题,向我显示相同的消息,如果您有任何解决方案,请分享我会投票
标签: c# asp.net-core