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

时间:2018-04-25 13:02:01

标签: model .net-core razor-pages

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

总结是我: 将span添加到我的Index.cshtml文件中,该文件实际上是从Razor页面加载HTML。 Index.cshtml中的相关HTML如下所示:

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

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

namespace FirstCore.Pages
{
    public class IndexModel : PageModel
    {

        public string UserName;
        public void OnGet()
        {

        }
    }
}

这个例子保持非常简单。 因此,在Index.cshtml中的HTML中,您可以看到我将该公共属性的值设置为&#34; IndexUser&#34;然后我将Razor页面的名称(&#34; BasicPartial&#34; - View)和Model对象传递给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。

主要问题 - 模型始终为空

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

Model is null

您可能认为UserName是null,但如果我在顶部放置一个非常简单的指令,如

<div>@Model</div> 

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

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

2 个答案:

答案 0 :(得分:11)

如果我对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>

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

model is no longer null

答案 1 :(得分:0)

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

From the docs for @page

  

@page使文件成为MVC动作-这意味着它无需通过控制器即可直接处理请求。

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

肯定是有缺陷的设计。