为什么我的模型对象在 dotnet 核心 2.x Razor 页面应用程序中的 Razor 页面上始终为 null?

Why is my Model object always null on my Razor Page in dotnet core 2.x Razor Page app?

我正在创建局部视图作为我 Index.cshtml 的一部分。 我正在遵循 Microsoft 文章中概述的基础知识 => https://docs.microsoft.com/en-us/aspnet/core/mvc/views/partial?view=aspnetcore-2.1

我的总结是: 向我的 Index.cshtml 文件添加一个跨度,该文件实际上是从 Razor 页面加载了 HTML。 Index.cshtml 中的相关 HTML 如下所示:

<span id="basicView">
    @{ 
        Model.UserName = "IndexUser";
        await Html.RenderPartialAsync("BasicPartial", Model);
    }
</span>

我已将 public 属性 添加到 RazorPage 中名为 UserName 的 IndexModel 中,它看起来如下所示:

namespace FirstCore.Pages
{
    public class IndexModel : PageModel
    {

        public string UserName;
        public void OnGet()
        {

        }
    }
}

这个例子非常简单。 因此,在 Index.cshtml 中的 HTML 中,您可以看到我将 public 属性 的值设置为 "IndexUser" 然后我传递了Razor 页面("BasicPartial" - 视图)和 BasicaPartial Razor 页面的模型对象。

BasicPartial 页面非常简单——由 Visual Studio 2017 模板生成——添加...Razor 页面...整个页面如下所示:

@page
@model IndexModel
@*
    For more information on enabling MVC for empty projects, visit http://go.microsoft.com/fwlink/?LinkID=397860
*@
<div>This is the text and the user name is @(Model.UserName).</div>

实际上,唯一重要的部分是我从传入的模型中读取 UserName 的 属性 值的位置。 您可以看到我还在顶部将 @model 定义为 IndexModel。

主要问题 - 模型始终为空

当我运行这个例子很简单。应用程序告诉我模型对象为空。

您可能认为是空的用户名,但是如果我在顶部放置一个非常简单的指令,例如

<div>@Model</div> 

然后它告诉我模型为空,即使我知道我正在传递它。

你知道为什么它是空的吗?

如果我对 BasicPartial.cshtml 文件进行一项更改,则模型不再为空。

我所要做的就是删除 @page 指令,这样 BasicPartial.cshtml 文件现在看起来如下所示:

@model IndexModel
@*
    For more information on enabling MVC for empty projects, visit http://go.microsoft.com/fwlink/?LinkID=397860
*@
<div>This is the text and the user name is @(Model.UserName).</div>

现在可以完美运行了。 Model 对象是一个有效对象,其 属性 值按预期设置。 (请参阅下图中突出显示的文本。)

一样,删除 @page 指令将解决问题。

From the docs for @page

@page makes the file into an MVC action - which means that it handles requests directly, without going through a controller.

换句话说,您的控制器实际上并未被使用,尽管被调用*。
*至少就我而言,我的控制器被称为 。我没有测试 OP 的代码

当然是一个有缺陷的设计。