【问题标题】:Mixing entity models and viewmodels in one view在一个视图中混合实体模型和视图模型
【发布时间】:2017-12-02 05:09:25
【问题描述】:

正如我开始理解的那样,在 MVC 中,视图模型在视图中显示数据都是关于视图模型的。但是当我的家庭控制器中的索引方法看起来像这样时;

public async Task<IActionResult> Index()
{
    return View(await _context.Products.ToListAsync());
}

然后如何在我的网页中插入带有视图模型的局部视图,如下所示 (_Layout.cshtml):

<div class="container body-content">
    @Html.Partial("_ShoppingCart.cshtml")
    @RenderBody()
</div>

毕竟,索引方法需要一个实体模型。如果我尝试将视图模型传递给索引视图,我会收到一个异常,告诉我在 _context 中找不到模型。

【问题讨论】:

  • 不相关的 nitpick,我建议您使用 ToList() 而不是 ToListAsync。我发现ToListAsync 的速度非常慢,而且您使用它的方式可能首先是同步的。
  • 您可以使用@Html.Action() 调用基于视图模型返回部分视图的服务器方法(并且Index() 不需要实体模型(也应该使用视图模型) )

标签: c# asp.net-mvc asp.net-core-2.0


【解决方案1】:

您可能已经知道为什么要在视图中使用 ViewModel 以及为什么不使用实体,但如果您不这样做,请让我解释一下。

当您在页面上显示数据时,您通常需要 ItemSelectedHideItem 之类的属性,即仅与页面相关且在您的 entities 上不需要的任何内容。

所以现在我们知道为什么需要保留entitiesviewmodels 的重要性。现在的问题是如何转移数据

from entities to viewmodels when displaying data

from viewmodels to entities when updating data on db

你有两个选择

  • 要么编写您自己的映射逻辑来进行转换。
  • 使用 Automapper (http://automapper.org/),它可以为您完成这项工作,您只需付出最少的努力。

如果您正在考虑使用 AutoMapper,那么还可以查看专门用于实体框架的 https://github.com/AutoMapper/AutoMapper.EF6

【讨论】:

  • 微软建议在这种情况下做什么?我敢肯定他们不会仅仅为了依赖第三方插件而制作出如此复杂而强大的框架(即 Asp.Net Core)?
  • asp.net 核心是一个模块化框架,使用这个框架给猫换皮的方法不止一种。这与学习曲线更相关。不是每个人都面临这个问题,因为他们可能会以不同的方式构建他们的应用程序。但这对于开始学习 MVC 的人或任何喜欢 MVC 而不是 web api、angularjs、web sockets 或 grpc 等的有经验的开发人员来说是一个常见的问题。
【解决方案2】:

你可以在这里使用子动作方法

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

@Html.Action("HomeSection")

@Html.Action("AboutSection") 

你可以看到这个索引页面没有分配任何模型现在检查 Homesection 操作看起来像这样

  [ChildActionOnly]
        public async Task<ActionResult> HomeSection()
        {
            try
            {
                Home home = new Home();
                home = await HomePageBLL.GetHomeSection();
                return View("_HomeSectionPartial", home);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

和_HomeSectionPartial 视图看起来像这样

@{
    Layout = null;
}

@model  NSDataComponent.Home
<section id="home" data-stellar-background-ratio="0.6" data-stellar-vertical-offset="20">

当您想使用具有不同模型的不同局部视图以在同一个主视图中呈现时使用这是一个最佳想法注意,即使主视图也可以具有模型库

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-06
    • 2014-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-21
    • 2011-07-16
    相关资源
    最近更新 更多