【问题标题】:Why does my view always expect 1 specific viewmodel? [duplicate]为什么我的视图总是需要 1 个特定的视图模型? [复制]
【发布时间】:2017-02-16 06:28:45
【问题描述】:

这个问题似乎在这个网站上被问过很多次,但我似乎仍然无法解决我的问题。我得到传递到字典的模型项是'X'类型,但是这个字典需要一个'Y'类型的模型项错误,即使我很确定我的代码指向正确的位置并接收正确的视图模型。

查看(索引)

@model EveryNationRandburg.ViewModels.AllUsers

@{
    ViewBag.Title = "Index";
    Layout = "~/Views/Shared/_Layout.cshtml";
}

<h2>Church Members</h2>

<p>@Html.ActionLink("New Member", "Register", "Account", null, new { @class = "btn btn-primary" })</p>

<table class="table table-bordered table-hover" id="kerkmembers">
    <thead>
    <tr>
        <th>Member</th>
        <th>Email</th>
        <th>Contact Number</th>
    </tr>
    </thead>
    <tbody>
    @foreach (var member in Model.AlleKerkMembers)
    {
        <tr>
            <td>@Html.ActionLink(@member.UserName, "Edit", "KerkMember", new {id = @member.Id}, null)</td>
            <td>@member.Email</td>
            <td>@member.PhoneNumber</td>
        </tr>
    }
    </tbody>
</table>


@section scripts
{
    <script>
        $(document).ready(function (){
            $("#kerkmembers").DataTable();
        })
    </script>
}

视图模型

public class AllUsers
{
    public List<ApplicationUser> AlleKerkMembers = new List<ApplicationUser>();
}

账户控制人

public ActionResult Index()
{
    var viewModel = new AllUsers
    {
        AlleKerkMembers = _context.Users.ToList()
    };
    return View(viewModel);
}

堆栈跟踪

InvalidOperationException:传入字典的模型项的类型为“EveryNationRandburg.ViewModels.AllUsers”,但此字典需要类型为“EveryNationRandburg.ViewModels.KonnekGroepViewModel”的模型项。

我的问题略有不同的是,每当我尝试将 viewModel 发送到视图时,我总是会收到错误消息,说它期待“Y”类型的项目(无论我声明什么模型,总是相同的)在我的视野顶部)

【问题讨论】:

  • 错误信息指向哪一行?是否 return View(viewModel); 您可以将整个错误消息添加到问题描述中。
  • 尝试清除解决方案,重启visual studio
  • 错误很明显-您将AllUsers的模型传递给期望KonnekGroepViewModel的视图,但您没有显示相关代码(具有KonnekGroepViewModel的视图或您如何称呼它)。最好的猜测是您在主视图中使用@Html.Partial()
  • 嗨@StephenMuecke,我已经添加了完整视图。如您所见,我期望的模型是 AllUsers。我可以逐步浏览视图并验证我收到的数据是否正确
  • 再次 - 阅读错误。您没有向我们展示正确的代码。在某个地方,您有一个带有 @model KonnekGroepViewModel 的视图,您正在调用它,但正在传递一个 AllUsers 的实例。阅读列出主要原因的欺骗。

标签: c# asp.net-mvc entity-framework viewmodel viewcontroller


【解决方案1】:

我建议的第一件事是将调试器附加到您的代码并查看您正在处理的值。使用调试器,您可以看到我们在这里看不到的调用堆栈。

return View(viewModel); 的结果在哪里使用?

您的视图构造函数没有列表。

您的视图期望的对象类型是什么? 应该是 AllUsers,因为您将 AllUsers 对象传递给它。

您可以尝试使用显式类型而不是 var 来确保传递正确的对象类型。代码也会更容易阅读。

请附加您的调试器并尝试以这种方式解决它。

【讨论】:

  • 嗨@KettuJKL 当我调试时,我可以单步执行整个视图而不会出现任何错误。我实际上可以看到我通过控制器中的视图模型(AllUsers)传递给视图的对象。我在这个视图中渲染了一个表格,并在我的数据库中显示了所有用户的一些详细信息。一旦代码跳出视图,它就会进入控制器的 Dispose() 方法。顺利通过,然后突然崩溃。我已经清理、重建并重新启动了 VS。不知道为什么会这样。
  • 能否在您的问题和调试日志中添加额外的描述?我的意思是它发生在 Dispose 方法和崩溃日志中。有人可能会立即看到发生了什么。
  • 哦,添加了错误的堆栈跟踪
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-03-20
  • 2019-06-22
  • 1970-01-01
  • 2020-05-09
  • 1970-01-01
  • 2017-05-15
  • 1970-01-01
相关资源
最近更新 更多