【问题标题】:model item passed into the ViewDataDictionary is of type传递给 ViewDataDictionary 的模型项是类型
【发布时间】: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


【解决方案1】:

您的操作后 JobAddress 正在返回 PostFou 类型的对象:

[HttpPost]
public async Task<IActionResult> JobAddress([Bind("FouName,FouPhon,FouEmai,FouAddr,FouPost,FouOrg")] PostZero postZero, PostOne postOne, PostFou postFou)
    {
        // ...
        return View(postFou);
    }

您的视图不期望此类型的对象并显示错误。

【讨论】:

    猜你喜欢
    • 2022-06-27
    • 2018-12-25
    • 1970-01-01
    • 1970-01-01
    • 2021-09-21
    • 1970-01-01
    • 2020-10-20
    • 2021-04-03
    相关资源
    最近更新 更多