查看传递错误的viewmodel

时间:2013-12-01 22:22:29

标签: asp.net-mvc asp.net-mvc-4 view model asp.net-mvc-5

我使用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呢?

任何帮助都非常感谢!

2 个答案:

答案 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);
    }