从使用不同模型的视图中显示模型列表项变量

时间:2016-09-14 17:39:43

标签: c# asp.net-mvc

我有一个类似于this post的设置,我正在尝试使用html帮助器根据lambda表达式在单独模型中的项目列表中显示特定项目。

我将在我的例子中使用专辑和流派。

namespace MvcMusicStore.Models
{
    public class Album
    {
        public int      AlbumId     { get; set; }
        public int      GenreId     { get; set; }
        public int      ArtistId    { get; set; }
        public string   Title       { get; set; }
        public decimal  Price       { get; set; }
        public string   AlbumArtUrl { get; set; }
        public Genre    Genre       { get; set; }
    }
}
namespace MvcMusicStore.Models
{
    public partial class Genre
    {
        public int      GenreId     { get; set; }
        public string   Name        { get; set; }
        public string   Description { get; set; }
        public string   ThisAlbumId     { get; set; }
        public List<Album> Albums   { get; set; }
    }
}

有一个视图使用了流派模型而我正在尝试显示一个Album.Title,其中Album.AlbumId == Genre.AlbumId

@foreach (var item in Model.Albums.Where(x=>x.AlbumId == Model.ThisAlbumId))
{
     <td>@Html.DisplayFor(modelItem => item.Title)</td>
}

它应该只返回一个AlbumId。目前我收到“Value not not null”错误。我也试过了

  <td>@Html.DisplayFor(model => model.Album.Where(x => x.Id == model.ThisAlbumId).FirstOrDefault())</td>

但我收到错误:

  

模板只能用于字段访问,属性访问,单维数组索引或单参数自定义索引器表达式

非常感谢任何帮助或指导。

1 个答案:

答案 0 :(得分:1)

第一次尝试看起来很好。看到错误的堆栈跟踪会很高兴。但是,如果您获得值不能为空,那么很可能因为Model为空;即视图的模型未被实例化并传递。从您的代码中,我可以推断出视图的模型是Genre类,您应该检查操作方法是否将模型传递给视图。如果你做得正确,动作方法中的相关部分应该看起来像这样:

    var model = new Genre
    {
        //set relevant properties
    };
    //set other relevant 'model' properties, if any
    return View("YourViewName", model);

关于第二错误:

  

模板只能用于字段访问,属性访问,单维数组索引或单参数自定义索引器表达式

这段代码:

<td>@Html.DisplayFor(model => model.Album.Where(x => x.Id == model.ThisAlbumId).FirstOrDefault())</td>

应改为

<td>@Model.Album.Where(x => x.Id == Model.ThisAlbumId).FirstOrDefault()</td>

我所做的就是取消.DisplayFor。如错误所示,.DisPlayFor等模板方法不能与方法或其他lambda类型表达式一起使用。

但是,另一个问题是,因为您正在调用.FirstOrDefault,这将返回Album个实例或null。既然你想要的是.AlbumId属性,那么我建议进行以下编辑:

<td>
 @{
     var oneItem = Model.FirstOrDefault(x => x.Id == Model.ThisAlbumId);
     //Notice that I used "Model" and not "model". The difference is huge!
     if (oneItem != null)
     {
        Html.Raw(oneItem.AlbumId);
     }
  }
</td>