Page 存在绑定模型问题,以及 OnPost 方法中的一些奇怪行为

问题描述 投票:0回答:2

Pref:我在 ASP.NET Core 中经历了一些非常奇怪的行为。我启动了一个 MVC 项目,但我还在项目中包含了一些 Razor 页面。

当我尝试绑定模型并单击“保存”按钮时,输入值为 null 或为空。该模型无效并且不包含输入值,它完全是空的。我检查了所有属性,一切似乎都几乎正确,但它没有绑定

Product
的输入值。

[BindProperty]
public ProductViewModel Product { get; set; }

e

enter image description here enter image description here

这真的很奇怪,我创建了第二个按钮,但由于某种原因它也调用了

OnPost
方法...类似的情况:删除
OnPost
方法并创建名为
OnPostSave
的方法不会被调用,发生了一些事情真的错了

<form method="post">
    @Html.AntiForgeryToken()
    <input asp-for="Product.Name" class="form-control" type="text" />
    <button type="submit" asp-page-handler="Save" class="btn btn-primary">Test</button>
</form>

我怀疑路由可能存在问题或配置错误,但我不完全确定。如果您有任何想法或需要更多信息,请告诉我。

谢谢!

我尝试调试

OnPost
方法,但我总是收到 null 或空值。在另一个关于按钮单击事件的情况下,我尝试重命名该方法并添加一些验证,但没有成功。

Folder structure

c# asp.net-core asp.net-core-mvc razor-pages
2个回答
0
投票

表单将根据绑定将值发布到控制器,因此如果您的 @model 是 ProductViewModel,那么您的控制器操作可以期待 ProductViewModel。如果您的 @model 是另一个包含 ProductViewModel 的视图模型(如您的视图模型所示),则控制器操作的映射需要一个“包含”名为 Product 的 ProductViewModel 成员的类。

因此,如果您的视图绑定到名为 ProductDetailViewModel 的模型类,您可以将其传递给 POST 操作。请记住,对于回发,视图模型实际上并未在服务器和浏览器之间传递。在回程中,表单帖子会经过输入控件并组成一个由命名值组成的普通旧式 JSON 对象。 MVC 服务器端将尝试找到合适的操作并尽可能填充参数,从而构成签名的实例。如果它得到类似“ProductDetail.Product.ProductId”的内容,并且您给它一个 ProductViewModel 来填充,它不会匹配任何内容。如果你给它一个 ProductDetailViewModel 或另一个名为“Foo”的类,它恰好有一个 ProductViewModel 类型的 Product 属性,那么它将用遇到的值填充它。

对于第二个按钮,如果您希望表单中的按钮不会回发,而只是连接一些 JS 事件,则需要将按钮类型属性为

type="button"
。按钮默认为“提交”。即使按钮未指定,MVC 也会寻找合适的 POST 操作来调用表单的当前路由。


0
投票

从您共享的屏幕截图来看,标签助手似乎不起作用。您可以在浏览器中F12并单击

Elements
选项卡来检查生成的html,正确的html应该是这样的:

<input type="text" id="Product_Name" name="Product.Name" value="">

请在您的当前 Razor 页面顶部添加以下代码:

@page
@model IndexModel

@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers

或者全局添加到

Pages/_ViewImports.cshtml
:

@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers

enter image description here 参考:

管理标签帮助程序范围

© www.soinside.com 2019 - 2024. All rights reserved.