我使用ASP.Net MVC5(VS 2013)创建了一个网站,但我想同样的问题会出现在MVC3或MVC4中
我有以下观点:
@model IEnumerable<WilhanWebsite.Models.TestimonialViewModel>
@{
ViewBag.Title = "Index";
Layout = "~/Views/Shared/_Layout.cshtml";
}
<h2>Index</h2>
<p>
@Html.ActionLink("Create New", "Create")
</p>
<table class="table">
@foreach (var item in Model) {
<tr>
<td>
@Html.DisplayFor(modelItem => item.Testimonial.Description)
</td>
<td>
@Html.DisplayFor(modelItem => item.Testimonial.Author)
</td>
<td>
@Html.DisplayFor(modelItem => item.Testimonial.Timestamp)
</td>
<td>
@Html.ActionLink("Edit", "Edit", new { id=item.Testimonial.TestimonialId }) |
@Html.ActionLink("Details", "Details", new { id=item.Testimonial.TestimonialId }) |
@Html.ActionLink("Delete", "Delete", new { id=item.Testimonial.TestimonialId })
</td>
</tr>
}
</table>
我的推荐控制器的索引操作会发回一个列表,视图会在html表格中正确显示现有的推荐。我的问题是,当我单击编辑超链接时,我收到以下错误:
传递到字典中的模型项是类型的 'WilhanWebsite.DomainClasses.Testimonial',但是这本字典 需要类型的模型项 'WilhanWebsite.Models.TestimonialViewModel'
我以前使用DomainClasses.Testimonial作为模型在控制器和视图之间传递,但今天我重构了创建新的专用视图模型。看来很高兴在显示数据时处理新的viewmodel,那么为什么当我点击Edit链接时它会传递旧的DomainClasses.Testimonial呢?
任何帮助都非常感谢!
答案 0 :(得分:0)
View预计会@model IEnumerable<WilhanWebsite.Models.TestimonialViewModel>
,因此您必须从Controller的Index操作方法中返回。如果没有看到您的控制器,我猜您会返回推荐类型的列表,而不是类型 TestimonialViewModel 的列表
// GET:/ Testimonial /
public ActionResult Index()
{
List<TestimonialViewModel> testimonialViewModel = new List<TestimonialViewModel>();
// Add some testimonials to your list.
return View(testimonialViewModel);
//NOT THIS - IT WILL THROW THE ERROR YOUR GETTING
return View(db.Testimonial.ToList());
}
//见证/索引
@model IEnumerable<WilhanWebsite.Models.TestimonialViewModel>
@{
ViewBag.Title = "Index";
}
<h2>Index</h2>
另外,如果您要返回System.Collection并指定了 TestimonialViewModel 。确保它实现IEnumerable。以下类型。
ICollection的
IDictionary的
IDictionaryEnumerator
IEnumerable的
IEnumerator的
IHashCodeProvider
的IList
答案 1 :(得分:0)
我可以通过将编辑操作更新为以下内容来修复:
public ActionResult Edit(int id)
{
var query = from t in _context.Testimonials
where t.TestimonialId == id
select t;
TestimonialViewModel tvm = new TestimonialViewModel();
tvm.Testimonial = query.First();
return View(tvm);
}