【问题标题】:View passing wrong viewmodel查看传递错误的视图模型
【发布时间】:2013-12-17 13:15:42
【问题描述】:

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

我的 Testimonial 控制器的 Index 操作发送回一个列表,视图在 html 表中正确显示现有的推荐。我的问题是,当我单击编辑超链接时,出现以下错误:

传入字典的模型项是类型 'WilhanWebsite.DomainClasses.Testimonial',但是这本词典 需要类型的模型项目 'WilhanWebsite.Models.TestimonialViewModel'

我以前使用 DomainClasses.Testimonial 作为模型在控制器和视图之间传递,但今天我重构以创建新的专用视图模型。显示数据时视图很乐意处理新视图模型似乎很奇怪,那么为什么当我单击编辑链接时它会传递旧的 DomainClasses.Testimonial ?

非常感谢任何帮助!

【问题讨论】:

  • 您的编辑操作和视图是什么样的(代码)?
  • 您的编辑操作发送了错误的模型类型,或者您的视图被编码为接受错误的模型类型。这与您的索引视图无关。
  • 抱歉耽搁了,感谢您的回复。你说的都是对的 - 问题出在我的控制器的编辑操作上。

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


【解决方案1】:

视图需要@model IEnumerable&lt;WilhanWebsite.Models.TestimonialViewModel&gt;,因此您必须从控制器的 Index 操作方法中返回它。如果没有看到您的控制器,我猜您返回的是 Testimonial 类型的 List 而不是 TestimonialViewModel 类型的 List

// 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
字典
IDictionaryEnumerator
IEnumerable
IEnumerator
IHashCodeProvider
列表

【讨论】:

  • 感谢您的回答。问题出在编辑操作上。我专注于索引操作,因此没有在问题中提供足够的信息。
  • 不客气。该错误消息是 MVC 中对错误的最糟糕的描述......他们可以使用数据字典或视图而不是字典,但字典并没有真正说明太多。
【解决方案2】:

我能够通过将编辑操作更新为以下内容来修复:

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

【讨论】:

    猜你喜欢
    • 2021-05-26
    • 2012-05-31
    • 2021-12-03
    • 2016-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多