为啥我的模型对象在 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
为啥我的 ASP.NET Core 3.1 控制器会自动为从视图返回的 EF Core 模型分配 ID?
dotnet core webapi json-api 兼容查询字符串路由
为啥我的 Entity Framework Core Database-First 模型自定义更改在 Re-Scaffold 后消失了?任何解决方案