为什么 PartialAsync 不调用相应的控制器方法?

Szy*_*bki 4 c# razor asp.net-core-mvc asp.net-core

我有一个 .NET Core 2.1 MVC 应用程序。

我有一个看起来像这样的家庭控制器:

public class HomeController : Controller
{
    public IActionResult Index()
    {
        return View();
    }

    public IActionResult CountView(MyModel model)
    {
        ...
        return PartialView(model);
    }
}
Run Code Online (Sandbox Code Playgroud)

在索引视图中,我想显示一个名为CountView.

但是当我在 Index.cshtml 中使用以下方法时:

@await Html.PartialAsync("CountView", Model)
Run Code Online (Sandbox Code Playgroud)

视图按照我的意愿显示,但控制器中的方法永远不会被调用,因此局部视图没有获得它需要的数据,而这些数据旨在由控制器方法获取。

为什么呢?

我怎样才能让它按预期工作?

SO *_*ood 7

@await Html.PartialAsync("CountView", Model)
Run Code Online (Sandbox Code Playgroud)

呈现局部视图,它不会为此调用任何控制器。在 ASP.NET Core 中执行此操作的正确方法是创建一个View Component

至于实现,这里是从之前链接的官方文档修改的一个简单的:

  1. ViewComponents在项目根目录创建文件夹
  2. 在其中创建一个“CounterViewComponent”类:
public class CounterViewComponent: ViewComponent
{
    public async Task<IViewComponentResult> InvokeAsync(MyModel model)
    {
        // magic here
        return View(model);
    }
}
Run Code Online (Sandbox Code Playgroud)
  1. 在您的视图中调用它:
@await Component.InvokeAsync("Counter", new { model = Model })
Run Code Online (Sandbox Code Playgroud)