我们如何编写要在def watch(request, video_id):
video_to_watch = Video.objects.get(id=video_id)
popular_videos = Video.objects.filter(views__gt=100)
页面中使用的函数。我们以前可以在视图中使用*.cshtml
或@helper
。我们如何做到这一点?例如,我想编写一个递归函数来显示所有配置值。我怎么能这样做?
@function
我想我们需要在project.json中添加一个依赖项,然后选择在Startup.cs中使用它。
答案 0 :(得分:2)
使用剃刀视图快速而肮脏,假设您的视图组件提供递归模型。
组件视图:
@model YourRecursiveDataStructure
<ul class="sidebar-menu">
<li class="header">MAIN NAVIGATION</li>
@foreach (var node in Model.RootNodes)
{
@Html.Partial("~/YourPath/RenderElement.cshtml", node)
}
</ul>
在视图中渲染元素:
@model YourRecursiveNode
<li>
<a href="@Model.Href">
<span>@Model.Display</span>
</a>
@Html.Partial("~/YourPath/RenderChildren.cshtml", Model)
</li>
然后在另一个视图中循环节点的子节点:
@model YourRecursiveNode
@if (Model.HasChildren)
{
<ul>
@foreach (var child in Model.Children)
{
@Html.Partial("~/YourPath/RenderElement.cshtml", child)
}
</ul>
}
答案 1 :(得分:1)
参考我们只能在网上看到的few设计discussions,@helper
因设计原因被移除;替换为View Components.
我建议使用如下所示的View Component:
public class ConfigurationKeysViewComponent : ViewComponent
{
private readonly IConfiguration config;
public ConfigurationKeysViewComponent(IConfiguration config)
{
this.config = config;
}
public IViewComponentResult Invoke(string currentSubKey = "")
{
return View(new ConfigurationData
{
Key = currentSubKey,
Value = config.Get(currentSubKey),
SubKeys = config.GetSubKey(currentSubKey).GetSubKeys().Select(sk => sk.Key)
});
}
}
您的ViewComponent的视图会相对简单:
<dt>@Model.Key</dt>
<dd>@config.Get(Model.Key)</dd>
@foreach (var sk in Model.SubKeys)
{
@Component.Invoke("ConfigurationKeys", sk)
}
然后,您可以从根视图中调用它,如下所示:
@Component.Invoke("ConfigurationKeys")
免责声明:我在SO编辑器中写道,可能存在编译器错误。另外,我不确定View Components是否支持默认参数 - 您可能需要在根视图调用视图组件时添加默认""
。
或者,如果这只是调试代码,您可以使用Stack<>
打开递归。