我有一个cshtml模板,我正在使用Razor来填充它.我正在传递一个包含多个子列表的对象,我需要从一个子列表中的一个项中获取值,以便在文本正文中使用.所以在开场标签中我有这个:
@{
var myId = @Model.myId;
List<MyObject> newObj = @Model.MyList.Where(l => l.Id == myId).ToList();
}
但是当我尝试执行模板时,它会抛出一个’<‘MyObject’>‘的错误未关闭,所有元素必须具有匹配的自闭标签或结束标签.我明白它似乎是把它读作一个html标签,但为什么它明显在编程标记内呢?我不能用剃刀调用列表对象吗?如果是这样,我如何获得这个特定的项目子列表?
我已经检查了页面的其余部分,并且html具有所有结束标记.
最佳答案 我认为要修复您的代码,您必须执行以下操作:
@{
var myId = Model.myId;
List<MyObject> newObj = Model.MyList.Where(l => l.Id == myId).ToList();
}
这简单地删除了模型前面的@.
但是我觉得更好的解决方案是尝试将逻辑代码保留在控制器而不是视图中.
例如,如果您使用的是部分视图.
在您的视图中,您可以调用操作并传入模型,如下所示:
@Html.Action("MyAction", Model)
这会调用一个控制器动作来做你的选择,即
[ChildActionOnly]
public ActionResult MyAction(MyModel model)
{
var newList = model.MyList.Where(l => l.Id == myId).ToList();
return PartialView("_MyPartial", newList);
}
然后在你的部分中使用@model属性,即
@model List<MyObject>