带有可选参数的 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" />
^-- 这两个都有效。
我正在创建一组表示不同视图过滤器的视图组件。到目前为止它们工作得很好,但我不明白我遇到的这种行为。
如果我使用声明两个 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" />
^-- 这两个都有效。