带有可选参数的 ViewComponent

ViewComponent with optional parameters

我正在创建一组表示不同视图过滤器的视图组件。到目前为止它们工作得很好,但我不明白我遇到的这种行为。

如果我使用声明两个 InvokeAsync:

public async Task<IViewComponentResult> InvokeAsync(string name)
public async Task<IViewComponentResult> InvokeAsync(string name, string title)

然后我明白了:

Error: View component 'MyViewComponent' must have exactly one public method named 'InvokeAsync' or 'Invoke'.

但如果我改为这样做:

public async Task<IViewComponentResult> InvokeAsync(string name, string title = "")

然后会发生这种情况:

<vc:my name="Hello" title="Hello"></vc:my> // Gets rendered
<vc:my name="Hello" title=""></vc:my>  // Gets rendered
<vc:my name="Hello"></vc:my> // Doesn't call InvokeAsync

那么,是否可以使用默认参数?我不能为此使用模型(客户要求)

根据this Github issue,团队似乎不会完成。

@rynowak Apr 29, 2017 - I'm going to move it in and mark it up for grabs. At this point locking down our public APIs and completing the tooling story needs to take priority.


4 年后更新: 这最终被 .NET 6 接受,现在应该可以使用了!

从其他评论来看,这听起来可能已在 .NET 6 中修复,但如果您现在需要解决方案,一个简单的方法是创建一个选项容器 class 并在其中传递参数。

public class MyComponentOptions
{
    public string Name;
    public string Title;
}

您的 Invoke 方法采用以下选项:

public async Task<IViewComponentResult> InvokeAsync(MyComponentOptions options)

在您的 HTML 中,您可以像这样传递它们:

@{ var bob = new MyComponentOptions { Name = "Bob" }; }
<vc:my-component options="@bob" />

@{ var alice = new MyComponentOptions { Name = "Alice", Title = "Developer" }; }
<vc:my-component options="@alice" />

^-- 这两个都有效。