我有一个cshtml模板,我正在使用Razor来填充它。我正在传递一个包含多个子列表的对象,我需要从一个子列表中的一个项中获取值,以便在文本正文中使用。所以在开场标签中我有这个:
@{
var myId = @Model.myId;
List<MyObject> newObj = @Model.MyList.Where(l => l.Id == myId).ToList();
}
但是当我尝试执行模板时,会抛出错误'&lt;'MyObject'&gt;'未关闭,所有元素必须具有匹配的自闭标签或结束标签。我明白它似乎是把它读作一个html标签,但为什么它明显在编程标记内呢?我不能用剃刀调用列表对象吗?如果是这样,我该如何到达这个特定的项目子列表?
我已经检查了页面的其余部分,并且html具有所有结束标记。
答案 0 :(得分:2)
我认为要修复您的代码,您必须执行以下操作:
@{
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>