自从我将ASP.NET5项目更新到beta4版本(包含在Visual Studio 2015 RC中的版本),我所有使用帮助器(helper)的Razor视图都存在问题,比如:
@helper foo()
{
<h2>Bar</h2>
}
导致以下错误:
错误 CS0103: 当前上下文中不存在名称为 'helper' 的内容。
@helper
指令不再受支持了吗?有人能指点一下这个问题的任何有用信息吗?
自从我将ASP.NET5项目更新到beta4版本(包含在Visual Studio 2015 RC中的版本),我所有使用帮助器(helper)的Razor视图都存在问题,比如:
@helper foo()
{
<h2>Bar</h2>
}
导致以下错误:
错误 CS0103: 当前上下文中不存在名称为 'helper' 的内容。
@helper
指令不再受支持了吗?有人能指点一下这个问题的任何有用信息吗?
@helper
指令已被删除,因为它对其他Razor功能施加了太多的限制:https://github.com/aspnet/Razor/issues/281。
编辑
需要明确的是:根据GitHub问题讨论,微软不打算在ASP.NET Core中重新引入@helper
指令或替代它。
不必使用辅助方法,您可以使用带有视图模型的部分视图来实现相同的功能。只需将相关参数传递到Html.Partial命令中即可。
void
方法可以调用自身,从而消除创建新部分类的需要。 - jspinella@functions {
private void RenderFoo()
{
<h2>Bar</h2>
}
}
<div>@{ RenderFoo(); }</div>
Templated Razor Delegates将是一个不错的选择。
声明foo
@{
Func<dynamic, object> foo =
@<h2>Bar</h2>
;
}
渲染foo
@foo(null)
请在<a href="~/logout">注销</a>后执行
page.cshtml
@inject SubstitutableHtmlUsecase SubstitutableHtmlUsecase
@inject IStringLocalizer<Msg> Msg
@SubstitutableHtmlUsecase.Render1(
Msg["Please {logout} once"],
"{logout}", @<a href="~/logout">@Msg["Logout"]</a>)
SubstitutableHtmlUsecase.cs
using Microsoft.AspNetCore.Html;
using System.Text.Encodings.Web;
namespace App.Usecases
{
public class SubstitutableHtmlUsecase
{
public IHtmlContent Render1(string body, string marker1, Func<object?, IHtmlContent> razor1)
{
var parts = body.Split(marker1);
return new Renderer(
(writer, encoder) =>
{
for (int idx = 0; idx < parts.Length; idx++)
{
bool isLast = (idx + 1 == parts.Length);
encoder.Encode(writer, parts[idx]);
if (!isLast)
{
razor1(null).WriteTo(writer, encoder);
}
}
}
);
}
private class Renderer : IHtmlContent
{
private readonly Action<TextWriter, HtmlEncoder> _writer;
public Renderer(Action<TextWriter, HtmlEncoder> writer)
{
_writer = writer;
}
public void WriteTo(TextWriter writer, HtmlEncoder encoder)
{
_writer(writer, encoder);
}
}
}
}