【问题标题】:ViewComponent with optional parameters带有可选参数的 ViewComponent
【发布时间】:2017-05-26 19:23:59
【问题描述】:

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

如果我使用声明两个 InvokeAsync:

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

然后我明白了:

错误:视图组件“MyViewComponent”必须只有一个名为“InvokeAsync”或“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

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

【问题讨论】:

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


    【解决方案1】:

    根据this Github issue的说法,好像不会由团队完成。

    @rynowak 2017 年 4 月 29 日 - 我将把它搬进去并标记它以供抓取。此时锁定我们的公共 API 并完成工具故事需要优先考虑。


    4 年后更新:这终于被 .NET 6 接受了,现在应该可以工作了!

    【讨论】:

    • 嗨,卡米洛。我认为它不会被修复。GIthub问题被链接两次,然后最后一个关闭的问题是github.com/aspnet/Razor/issues/1266,它解释它不会被关闭。
    • 嗨@gsharp,它似乎是抢购的,所以也许它会在某个时候完成。可能需要更多的社区请求让团队查看它。
    • 仅供参考:根据相同的 GitHub issue,现在指定用于 .NET 5.0。欢迎更新!
    • 该修复不适用于 .NET 5.0,但听起来它已在最新的 .NET 6 预览版(7 月的 #6)中修复。
    【解决方案2】:

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

    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" />
    

    ^-- 这两个都行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-02-28
      • 2016-10-17
      • 2021-10-18
      • 1970-01-01
      • 1970-01-01
      • 2012-07-16
      • 2017-03-28
      相关资源
      最近更新 更多