Pref:我在 ASP.NET Core 中经历了一些非常奇怪的行为。我启动了一个 MVC 项目,但我还在项目中包含了一些 Razor 页面。
当我尝试绑定模型并单击“保存”按钮时,输入值为 null 或为空。该模型无效并且不包含输入值,它完全是空的。我检查了所有属性,一切似乎都几乎正确,但它没有绑定
Product
的输入值。
[BindProperty]
public ProductViewModel Product { get; set; }
这真的很奇怪,我创建了第二个按钮,但由于某种原因它也调用了
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 或空值。在另一个关于按钮单击事件的情况下,我尝试重命名该方法并添加一些验证,但没有成功。
表单将根据绑定将值发布到控制器,因此如果您的 @model 是 ProductViewModel,那么您的控制器操作可以期待 ProductViewModel。如果您的 @model 是另一个包含 ProductViewModel 的视图模型(如您的视图模型所示),则控制器操作的映射需要一个“包含”名为 Product 的 ProductViewModel 成员的类。
因此,如果您的视图绑定到名为 ProductDetailViewModel 的模型类,您可以将其传递给 POST 操作。请记住,对于回发,视图模型实际上并未在服务器和浏览器之间传递。在回程中,表单帖子会经过输入控件并组成一个由命名值组成的普通旧式 JSON 对象。 MVC 服务器端将尝试找到合适的操作并尽可能填充参数,从而构成签名的实例。如果它得到类似“ProductDetail.Product.ProductId”的内容,并且您给它一个 ProductViewModel 来填充,它不会匹配任何内容。如果你给它一个 ProductDetailViewModel 或另一个名为“Foo”的类,它恰好有一个 ProductViewModel 类型的 Product 属性,那么它将用遇到的值填充它。
对于第二个按钮,如果您希望表单中的按钮不会回发,而只是连接一些 JS 事件,则需要将按钮类型属性为
type="button"
。按钮默认为“提交”。即使按钮未指定,MVC 也会寻找合适的 POST 操作来调用表单的当前路由。
从您共享的屏幕截图来看,标签助手似乎不起作用。您可以在浏览器中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