【问题标题】:ASP.NET MVC display property from other model in view视图中其他模型的 ASP.NET MVC 显示属性
【发布时间】:2020-09-06 05:53:15
【问题描述】:

首先对这个蹩脚的命名感到抱歉,但我不知道如何正确地提出我的问题。

重点是:我有一个用 C# 编写的 ASP.NET MVC 应用程序,并且我有两个模型类 - SongGenre

Song 模型类中,我有一个属性GenreId,它指向Genre 模型类的属性Id

在为Song 生成的 viev 中(用于显示带有艺术家和流派名称的歌曲标题)我有以下 HTML 帮助器:

@Html.DisplayFor(modelItem => item.GenreId)

显然显示的是GenreID,而不是流派的名称。

但是我该怎么说这个 HTML 助手“显示 Genre.Nameitem.GenreId 具有相同的 Genre.Id

我知道要列出可用的流派列表,我必须添加以下行:

ViewBag.Genres = db.Genres.ToList();

在返回视图的控制器动作中,但是如何让它按照我描述的方式使用它?

【问题讨论】:

  • DisplayFor 将使用该类型的默认显示模板,在本例中为整数。一种选择是使用 DropDownListFor 并将您的流派作为项目传递。如果您只需要显示,可以将输入设为只读或禁用。如果您只想要文本,则需要遵循以下答案

标签: c# asp.net-mvc


【解决方案1】:

在 MVC 中,访问多表的最常见方法是使用 viewmodel。您可以像这样对模型:

    public class SongInfo
    {
        public Song Song {get; set;}
        public Genre Genre {get; set;}
    }

然后使用linq进行选择:

    var view = from s in db.Song
               join g in db.Genre on s.GenreId equals g.Id
               select new SongInfo
               {
                   Song = s,
                   Genre =g,
               }

在视图中,助手可以是:

    @Html.DisplayFor(modelItem => item.Genre.Name)

【讨论】:

  • 但是我应该在哪里声明这个 view 变量?在控制器中还是在视图中?在第一种情况下如何将其传递给查看?
  • 我终于弄清楚了:在控制器动作中,然后将其作为模型传递给 View 方法。当然,相应地更改视图中使用的模型声明(以及帮助器中的模型声明,如 item.Song.Name,而不仅仅是 item.Name)。在我的情况下,还在 global.asax.cs 中添加新的“使用”,因为我在“模型”的“视图模型”子文件夹中添加了视图模型(所以我的额外使用就像:使用 [项目名称].Models.ViewModels;) - 找到这个小事是我的主要问题,因为我得到的错误不是很明确......(我认为这些信息可能对下一个有类似问题的人有用。)
猜你喜欢
  • 1970-01-01
  • 2013-01-23
  • 2011-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-15
  • 1970-01-01
  • 2012-10-26
相关资源
最近更新 更多