调用View Component的问题

时间:2017-04-01 16:00:18

标签: c# asp.net-core

我正在开发我的第一个asp.net核心项目,因此也是我的第一个视图组件。我以为我已经按照教程中的每一步,但我无法成功调用我的视图组件。

这是我的代码:

/ViewComponents/ItemListViewComponent.cs

using Microsoft.AspNetCore.Mvc;

namespace LC.CompuTECH._2017.ViewComponents
{
    public class ItemListViewComponent : ViewComponent
    {
        public ItemListViewComponent(string t)
        {
            switch (t.ToUpper())
            {
                case "STUDENT":
                    this.Type = ListTypes.Student;
                    break;

                case "WORK":
                    this.Type = ListTypes.Work;
                    break;

                case "GAMER":
                    this.Type = ListTypes.Gamer;
                    break;

                case "OTHER":
                    this.Type = ListTypes.Other;
                    break;
            }
        }

        public IViewComponentResult Invoke()
        {
            return View();
        }

        public ListTypes Type { get; internal set; }

        public enum ListTypes
        {
            Student,
            Work,
            Gamer,
            Other
        }
    }
}

/Views/Shared/Components/ItemList/Default.cshtml

MY VIEW COMPONENT

我尝试这样调用:

@await  Component.InvokeAsync("ItemList", new { t = "student" })

但我只得到:

  

InvalidOperationException:无法解析类型' System.String'的服务。在尝试激活' LC.CompuTECH._2017.ViewComponents.ItemListViewComponent'。

这应该是如此基本,所以我无法弄清楚我做错了什么。

任何帮助都将受到高度赞赏

1 个答案:

答案 0 :(得分:2)

你的构造函数应该只接受可以注入的东西,即组件的依赖关系。

无论你想传入什么,都会进入invoke方法,而不是构造函数

using Microsoft.AspNetCore.Mvc;

namespace LC.CompuTECH._2017.ViewComponents
{
    public class ItemListViewComponent : ViewComponent
    {
        public ItemListViewComponent()
        {

        }

        public IViewComponentResult Invoke(string t)
        {
            switch (t.ToUpper())
            {
                case "STUDENT":
                    this.Type = ListTypes.Student;
                    break;

                case "WORK":
                    this.Type = ListTypes.Work;
                    break;

                case "GAMER":
                    this.Type = ListTypes.Gamer;
                    break;

                case "OTHER":
                    this.Type = ListTypes.Other;
                    break;
            }

            return View();
        }

        public ListTypes Type { get; internal set; }

        public enum ListTypes
        {
            Student,
            Work,
            Gamer,
            Other
        }
    }
}

另请注意,除非您有等待使用Invoke而不是InvokeAsync,否则如果您使用InvokeAsync,那么您的方法签名应为

Task<IViewComponentResult> InvokeAsync(string t)

并在该方法中等待一些东西,即对服务的调用