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