【问题标题】:Return ViewComponent from controller with parameters从带有参数的控制器返回 ViewComponent
【发布时间】:2017-08-17 09:53:41
【问题描述】:

我正在尝试从控制器调用 ViewComponent 并通过以下方式将一些参数作为匿名对象传递:

public IActionResult Test(string pod, string start, string end)
{
    ServiceClient r2s = new R2S.ServiceClient();
    R2S.Konstant[] kData = r2s.GetKonstantListAsync(new string[] { "STATION" }, new string[] { pod }).Result; // mätarnummer in... --> alla konstanter kopplade till denna.

    return ViewComponent("MeterReader2", new { k = kData[0], fromDate = start, toDate = end });
}

我的 ViewComponent 看起来像这样:

public class MeterReader2ViewComponent : ViewComponent
{
    public async Task<IViewComponentResult> InvokeAsync(Models.Konstant k, string fromDate, string toDate) // Endast en kanal.
    {
        code.... 
    }
 }

我在 ViewComponent 中放置了一个断点。当我运行代码时,它不会中断。但是,如果我只是调用 ViewComponent 而不传递任何值,它确实会中断。像这样:

public IActionResult Test(string pod, string start, string end)
{
    ServiceClient r2s = new R2S.ServiceClient();
    R2S.Konstant[] kData = r2s.GetKonstantListAsync(new string[] { "STATION" }, new string[] { pod }).Result; // mätarnummer in... --> alla konstanter kopplade till denna.

     return ViewComponent("MeterReader2");
}

【问题讨论】:

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


    【解决方案1】:

    通常,您不会以这种方式返回 ViewComponent。相反,您将创建一个 View,并在该 View 的标记中调用 ViewComponent,将您可能需要的任何相关属性传递给它。

    注意:您有一个同步方法Test,它调用一个异步命令.GetKonstantListAsync。要么全部同步,要么更改方法定义以使其异步。 (我假设你想保持异步,所以我修改了方法并添加了 await 关键字。

    在你的控制器类中:

    public class MyController
    {
        public async Task<IActionResult> Test(string pod, string start, string end)
        {
            var r2s = new R2S.ServiceClient();
            R2S.Konstant[] kData = await r2s.GetKonstantListAsync(new string[] { "STATION" }, new string[] { pod }).Result;
            ViewData["start"] = start;
            ViewData["end"] = end;
    
            return View(kData);
        }
    }
    

    视图组件:

    namespace MyApp.ViewComponents
    {
        public class MeterReader2ViewComponent : ViewComponent
        {
            public async Task<IViewComponentResult> InvokeAsync(Models.Konstant k, string fromDate, string toDate) // Endast en kanal.
            {
                // code.... 
            }
        }
    }
    

    在 Views\MyController\Task.cshtml 中

    @using MyApp.ViewComponents;
    @model RS2.Konstant[];
    
    <h2>Here are some View Components!</h2>
    @foreach (var konstant in Model) {
        @await Component.InvokeAsync(nameof(MeterReader2ViewComponent ), new { k = konstant, fromDate = ViewData["start"], toDate = ViewData["end"]})
    }
    

    抱歉,如果我的代码不太准确,我目前不在 Visual Studio 前进行测试。

    【讨论】:

    • 我明白了。我刚刚尝试了这种方法。如果我创建一个视图,然后使用新参数调用 ViewComponent,则会正确加载一个新视图。但是,我目前已经在另一个 ViewComponent 中。如何使调用发生在同一个视图组件视图中?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-14
    • 1970-01-01
    • 2013-10-26
    • 2014-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多