使用参数从控制器返回ViewComponent

时间:2017-08-17 09:53:42

标签: c# asp.net-core asp.net-core-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", 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");
}

1 个答案:

答案 0 :(得分:0)

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

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

在您的Controller类中:

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);
    }
}

ViewComponent:

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前面测试它。