我有一个类似于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>
但我收到错误:
模板只能用于字段访问,属性访问,单维数组索引或单参数自定义索引器表达式
非常感谢任何帮助或指导。
答案 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>