ViewComponent作为Tag Helper确实没有被调用

时间:2017-05-19 20:01:32

标签: c# asp.net-core asp.net-core-1.1 asp.net-core-viewcomponent

在ASP.NET Core 1.1中引入了ViewComponent作为Tag Helper(请参阅Invoking a view component as a Tag Helper here部分)。但以下仅返回视图的Test for VC部分。似乎<vc:annual-orders>...</vc:annual-orders>部分根本没有被调用。

视图\共享\组件\ AnnualOrders \ Default.cshtml

@{ 
    Layout = "";
}
<div>Test for VC</div>
<div>
    <vc:annual-orders>

    </vc:annual-orders>
</div>

的Myproj \ ViewComponents \ AnnualOrdersViewComponent.cs

public class AnnualOrdersViewComponent : ViewComponent
{
    private readonly OrdersContext _context;

    public AnnualOrdersViewComponent(OrdersContext context)
    {
        _context = context;
    }

    public async Task<IViewComponentResult> InvokeAsync()
    {
        var lstOrders = _context.Where(t => t.orderType == "new");
        return View(await lstOrders);
    }
}

注意:

  1. 我使用的是ASP.NET Core 1.1,而没有标记帮助程序的ViewComponents工作正常。
  2. 我还关注了MSDN的official tutorial关于How to Invoke a View component as a tag helper的问题,其中解释了Tag Helpers的Pascal类和方法参数已转换为较低的kebab case

3 个答案:

答案 0 :(得分:3)

这不能解决您的具体情况,但它与您密切相关,因此我认为我会将它留给需要听的人:

即使标记帮助器已正确注册,例如{@ {1}},按照@ alan-savage的回答,如果不包括_ViewStart.cshtml方法中所有必需的参数,它将无法渲染。这看起来似乎是不言而喻的,但是由于它没有异常响应,因此在开始时可能会造成混淆, Visual Studio 中也没有为此内置任何设计时验证。

例如,如果您有:

InvokeAsync()

然后将您的标签助手称为:

public class AnnualOrdersViewComponent : ViewComponent {
  public async Task<IViewComponentResult> InvokeAsync(string labelName) {
    … 
  }
}

您的代码将在没有警告的情况下进行编译,并且您的页面将毫无例外地运行-但是不会渲染视图组件,而是将其注入页面的源代码中。实际上,如果您将视图组件参数值设置为可选,甚至会发生这种情况,因为标记帮助程序语法不支持可选参数:

<vc:annual-orders></vc:annual-orders>

很明显,在上述两个示例中,都可以通过以下方式解决此问题:

public class AnnualOrdersViewComponent : ViewComponent {
  public async Task<IViewComponentResult> InvokeAsync(string labelName = null) {
    … 
  }
}

同样,这不能解决您的问题的具体细节,但是我认为遇到此问题的开发人员很可能会遇到此线程,因此,如果标签帮助程序已经存在,我想将此作为另一个故障排除步骤包括在内正确注册。

答案 1 :(得分:1)

我一直在努力解决这个问题,并最终设法让视图组件的标记助手工作。 我遇到的问题是标记帮助程序没有处理区域内的视图。 为了解决这个问题,我将/ Views目录中的_ViewImports.cshtml和_ViewStart.cshtml页面复制到了/ Areas // Views目录中,标签助手现在正常工作,VS正在我的属性上给我智能感知。

不要忘记添加到_ViewStart.cshtml文件(包含视图组件的程序集的名称在哪里:

true

答案 2 :(得分:0)

有效。

@addTagHelper *, MyProject.Components

这有效

@addTagHelper *, MyAssemblyName

它使用程序集名称,而不是名称空间。