为什么我的Model对象在dotnet core 2.x Razor Page app中的Razor页面上始终为null?

rad*_*vus 11 model .net-core razor-pages

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

它的摘要是我:在我的Index.cshtml文件中添加一个span,它实际上是从Razor页面加载了HTML.Index.cshtml中的相关HTML如下所示:

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

我已将公共属性添加到R​​azorPage中名为UserName的IndexModel中,它看起来如下所示:

namespace FirstCore.Pages
{
    public class IndexModel : PageModel
    {

        public string UserName;
        public void OnGet()
        {

        }
    }
}
Run Code Online (Sandbox Code Playgroud)

对于这个例子,它保持非常简单.因此,在Index.cshtml中的HTML中,您可以看到我将该公共属性的值设置为"IndexUser",然后将Razor页面的名称("BasicPartial" - View)和Model对象传递给BasicaPartial剃刀Page.

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>
Run Code Online (Sandbox Code Playgroud)

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

主要问题 - 模型总是空的

当我运行这个非常简单的例子时.应用程序告诉我Model对象为null.

模型为空

你可能认为它是UserName是null,但是如果我把一个非常简单的指令放在顶部就好了

<div>@Model</div> 
Run Code Online (Sandbox Code Playgroud)

然后它告诉我Model是null,即使我知道我正在传递它.

你知道为什么它是null吗?

rad*_*vus 16

如果我对BasicPartial.cshtml文件进行一次更改,则Model不再为null.

我所要做的就是删除@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>
Run Code Online (Sandbox Code Playgroud)

现在它完美无缺.Model对象是一个有效的对象,其属性值按预期设置.(参见下图中突出显示的文字.)

模型不再为空

  • 感谢有关删除@page指令的提示,最终成为我的问题. (3认同)
  • 谢谢你让我知道.我想其他人也不得不偶然发现这一点,我想知道为什么我没有听到或看到更多的人提到它.很高兴它有所帮助. (2认同)
  • 我在这个bs上花了4个小时.想想生成的内容应该没问题,因为我在"添加视图"向导中完成了这项工作.道具到MS. (2认同)
  • @Kimmax是的,我也浪费了很多时间试图解决该问题。这让我发疯。没错,您没想到会出现问题,因为这是模板添加的代码。 (2认同)

Mar*_*ars 9

正如OP指出的那样,删除@page指令可以解决问题。

来自@page 的文档

@page 使文件成为 MVC 操作 - 这意味着它直接处理请求,而不通过控制器。

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

肯定是一个有缺陷的设计。