Asp.net mvc Create ActionResult for save抛出错误,表示传递到字典中的模型项的类型为

Asp.net mvc Create ActionResult for save抛出错误,表示传递到字典中的模型项的类型为,asp.net-mvc,asp.net-mvc-4,Asp.net Mvc,Asp.net Mvc 4,虽然这个错误在论坛中很常见,但我不知道如何在我的项目中修复它。我是MVC框架的新手 查看代码:- @model ClassifiedProject.Models.CreateAdvertVM <div class="editor-label">@Html.LabelFor(model => model.AdvTitle) &nbsp;&nbsp;&nbsp;<i>(E.g. Old Samsung Galaxy Tab 2)&l

虽然这个错误在论坛中很常见,但我不知道如何在我的项目中修复它。我是MVC框架的新手

查看代码:-

    @model ClassifiedProject.Models.CreateAdvertVM

  <div class="editor-label">@Html.LabelFor(model => model.AdvTitle) &nbsp;&nbsp;&nbsp;<i>(E.g. Old Samsung Galaxy Tab 2)</i></div>
        <div class="editor-field">
            @Html.EditorFor(model => model.AdvTitle)
            @Html.ValidationMessageFor(model => model.AdvTitle)
        </div>
        <div class="editor-label">@Html.LabelFor(model => model.AdvDescription)</div>
        <div class="editor-field">
            @Html.TextAreaFor(model => model.AdvDescription)
            @Html.ValidationMessageFor(model => model.AdvDescription)
        </div>
        <div class="editor-label">@Html.Label("Advertisement Category")</div>
        <div class="editor-label">
                @Html.DropDownListFor(model => model.SelectedCategoryId, Model.Categories, new { @class = "ddlcs" })
                @Html.ValidationMessageFor(model => model.SelectedCategoryId)
        </div>
    <p><input type="submit" value="Save" /></p>
呈现阶段中窗体的控制器代码:-

    // GET: /Advert/Create
        public ActionResult Create()
        {
            var model = new CreateAdvertVM();            
            ViewBag.Message = "Post New Advertisement.";

           ////Render Category DDL
            var cat = from s in db.CategoryDbSet
                      where s.IsActive == true
                      orderby s.CatName
                      select new { s.CatID, s.CatName };

            var catListItems = cat.ToList().Select(c => new SelectListItem   
                                                                        {
                                                                            Text = c.CatName,
                                                                            Value = c.CatID.ToString()
                                                                        }).ToList();

            catListItems.Insert(0, new SelectListItem { Text = "[--Select the category--]", Value = "" });
            model.Categories = catListItems;
return View(model);
从EF类继承的视图模型:-

  [NotMapped]
    public class CreateAdvertVM : TR_ADVERTISEMENT
    {
        [DisplayName("Category")]
        [Required]
        public int? SelectedCategoryId { get; set; }    
        public IEnumerable<SelectListItem> Categories { get; set; }
    }
[未映射]
公共类CreateAdvertVM:TR_广告
{
[显示名称(“类别”)]
[必需]
公共int?SelectedCategoryId{get;set;}
公共IEnumerable类别{get;set;}
}
EF型号:-

 public class TR_ADVERTISEMENT
    {
        [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int AdvID { get; set; }
        [Required]
        [DisplayName("Sub Category")]         
        public int SubCatID { get; set; }    
        public int CurrencyID { get; set; }            
        [DisplayName("Price on request")]    
        public bool IsPriceOnRequest { get; set; }    
        [DisplayName("Posted Date")]
        [DisplayFormat (DataFormatString="{0:dd-MM-yyyy}")]
        public Nullable<System.DateTime> CreatedDate { get; set; }    
        public Nullable<System.DateTime> ModifiedDate { get; set; }
}
公共类tru广告
{
[Key,DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int AdvID{get;set;}
[必需]
[显示名称(“子类别”)]
公共int SubCatID{get;set;}
公共int CurrencyID{get;set;}
[DisplayName(“按需定价”)]
公共bool IsPriceOnRequest{get;set;}
[显示名称(“发布日期”)]
[DisplayFormat(DataFormatString=“{0:dd-MM-yyyy}”)]
公共可为空的CreatedDate{get;set;}
公共可为空的ModifiedDate{get;set;}
}
单击save按钮,我必须使用EF模型将数据保存到tr_广告表中

请提出这个问题的解决办法


它是传递到创建操作方法中的模型类型

public ActionResult Create(TR_ADVERTISEMENT tr_advert)
应该是

public ActionResult Create(CreateAdvertVM tr_advert)
我假设,如果您的模型无效,您将在您的操作结果(您没有显示)中进一步向下传递它,例如

但是,对于该视图,此时传递的模型类型是错误的

编辑

我还将更新您的视图模型,以便不从EF类继承,只将EF类作为属性包含

public class CreateAdvertVM
    {
        [DisplayName("Category")]
        [Required]
        public int? SelectedCategoryId { get; set; }    
        public IEnumerable<SelectListItem> Categories { get; set; }
        public TR_ADVERTISEMENT tr_advert{get;set;}
    }

请提交stacktrace。完整的错误消息是什么?添加了错误截图。因为我对CreateAdvertVM类使用了[NotMapped]注释,它还能工作吗?是的,视图模型只是一个保存视图数据的类,通常完全独立于EF。在做了上述更改后,我得到了不同的错误。@Karan-请查看编辑。您将无法直接将CreateAdvtVM传递到EF。您必须以某种方式创建或提取您试图创建的实际EF类。我在我的编辑中给出了一个例子,我进行了更改,现在保存表单后,我得到“具有键'SelectedCategoryId'的ViewData项的类型为'System.Int32',但必须为'IEnumerable'类型。”
Return View(tr_advert)
public class CreateAdvertVM
    {
        [DisplayName("Category")]
        [Required]
        public int? SelectedCategoryId { get; set; }    
        public IEnumerable<SelectListItem> Categories { get; set; }
        public TR_ADVERTISEMENT tr_advert{get;set;}
    }
[HttpPost]
public ActionResult Create(CreateAdvertVM model)
{         
if (ModelState.IsValid)
{                   
    model.tr_advert.CreatedDate = model.tr_advert.ModifiedDate = DateTime.Now;

    if (model.tr_advert.IsPriceOnRequest)
    {
        model.tr_advert.CurrencyID = 0;
        model.tr_advert.Price = 0;
    }

    db.ADVERTISEMENT.Add(model.tr_advert);
    db.SaveChanges();
    return RedirectToAction("Index");
}