为啥我的模型对象在 dotnet core 2.x Razor 页面应用程序中的 Razor 页面上始终为空?

Posted

技术标签:

【中文标题】为啥我的模型对象在 dotnet core 2.x Razor 页面应用程序中的 Razor 页面上始终为空?【英文标题】:Why is my Model object always null on my Razor Page in dotnet core 2.x Razor Page app?为什么我的模型对象在 dotnet core 2.x Razor 页面应用程序中的 Razor 页面上始终为空? 【发布时间】:2018-10-05 23:29:57 【问题描述】:

我正在创建一个局部视图作为我的 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>

我已将公共属性添加到 RazorPage 中名为 UserName 的 IndexModel,它如下所示:

namespace FirstCore.Pages

    public class IndexModel : PageModel
    

        public string UserName;
        public void OnGet()
        

        
    

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

BasicPartial 页面非常简单 -- 是从 Visual Studio 2017 模板生成的 - Add...Razor Page... 整个东西看起来像:

@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>

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

主要问题 - 模型始终为空

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

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

<div>@Model</div> 

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

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

【问题讨论】:

【参考方案1】:

如果我对 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 指令的提示,这最终成为我的问题。 感谢您告诉我。我想其他人也必须偶然发现这一点,我想知道为什么我没有听到或看到更多人提到它。很高兴它有帮助。 我在这个 bs 上花了 4 个小时。认为生成的内容应该没问题,因为我的“添加视图”向导完成了这项工作。给 MS 的道具。 @Kimmax 是的,我也浪费了好几个小时试图解决这个问题。它把我逼疯了。你是对的,因为这是模板添加的代码,所以你不会想到问题。【参考方案2】:

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

From the docs for @page

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

换句话说,您的控制器实际上并没有被使用,尽管被调用*。 *至少在我的情况下,我的控制器被调用。我没有测试OP的代码

当然是有缺陷的设计。

【讨论】:

花了 45 分钟试图找出我的部分有什么问题。谢谢你的回答,我现在可以爬出兔子洞了。

以上是关于为啥我的模型对象在 dotnet core 2.x Razor 页面应用程序中的 Razor 页面上始终为空?的主要内容,如果未能解决你的问题,请参考以下文章

为啥使用 Core Data 的人想要在同一个托管对象模型中使用多个持久存储?

dotnet core webapi调用.net webapi2

DotNet core 没有与此对象关联的进程

为啥我的 ASP.NET Core 3.1 控制器会自动为从视图返回的 EF Core 模型分配 ID?

dotnet core webapi json-api 兼容查询字符串路由

为啥我的 Entity Framework Core Database-First 模型自定义更改在 Re-Scaffold 后消失了?任何解决方案