Asp.Net Core Razor Page PUT Handler 模型绑定器未绑定来自 ajax put 上的 java 脚本的序列化表单

Posted

技术标签:

【中文标题】Asp.Net Core Razor Page PUT Handler 模型绑定器未绑定来自 ajax put 上的 java 脚本的序列化表单【英文标题】:Asp.Net Core Razor Page PUT Handler model binder not binding the serialized form from java script on ajax put 【发布时间】:2019-12-10 05:16:51 【问题描述】:

我正在尝试序列化表单并将其放入服务器,但由于某种原因模型绑定无法绑定模型。

这是我的 javascript 按钮点击,

$.when(ajaxFormPutAsync(window.userUrls.update, $('#formUserEdit').serialize(), true)).done((response) => 

       );

ajaxFormPutAsync方法:

function ajaxFormPutAsync(requestUrl, putData, global) 
    try 
        return $.ajax(
            type: "PUT",
            url: requestUrl,
            async: true,
            global: global,
            headers: 
                "XSRF-TOKEN": $('input[name="__RequestVerificationToken"]').val()
            ,
            data: putData,
            error: function (jqXhr, textStatus, errorThrown) 
                console.log(jqXhr);
            
        );
     catch (q) 
        ajaxIndicatorStop();
    

    return false;
;

这是我的表格,

<form id="formUserEdit" method="put">
    <div class="form-row">
        <div class="form-group col-md-6">
            <label asp-for="FirstName"></label>
            <input asp-for="FirstName" class="form-control form-control-sm">
            <span asp-validation-for="FirstName" class="text-danger"></span>
        </div>
        <div class="form-group col-md-6">
            <label asp-for="LastName"></label>
            <input asp-for="LastName" class="form-control form-control-sm">
            <span asp-validation-for="LastName" class="text-danger"></span>
        </div>
    </div>
    <div class="form-row">
        <div class="form-group col-md-6">
            <label asp-for="Designation"></label>
            <input asp-for="Designation" class="form-control form-control-sm">
            <span asp-validation-for="Designation" class="text-danger"></span>
        </div>
        <div class="form-group col-md-6">
            <label asp-for="IdentityNumber"></label>
            <input asp-for="IdentityNumber" class="form-control form-control-sm">
            <span asp-validation-for="IdentityNumber" class="text-danger"></span>
        </div>
    </div>
    <input type="hidden" asp-for="Id" />
</form>

这是我的RazorPageHandler

public async Task<IActionResult> OnPutAsync(
    [FromBody] UserViewModel userViewModel,
    CancellationToken ct)

...

这是我的UserViewModel

    public class UserViewModel
    
        public Guid Id  get; set; 

        [Required]
        [Display(Name = "First Name")]
        public string FirstName  get; set; 

        [Required]
        [Display(Name = "Last Name")]
        public string LastName  get; set; 

        [Required]
        public string Designation  get; set; 

        [Required]
        [Display(Name = "Identity Number")]
        public string IdentityNumber  get; set; 
    

请求正在访问我的页面处理程序,但 userViewModel 始终是 null

对我哪里错了有什么建议吗?

请帮忙。

【问题讨论】:

在您的控制器操作中,尝试将模型绑定从 [FromBody] 更改为 [FromForm] 并查看它的行为。 好你拯救了我的一天。把它作为我会接受的答案。 【参考方案1】:

Parameter Binding 在 Asp.Net 中非常具体,这意味着如果您打算使用 ajax 或表单本身从您的前端 POST 数据,您必须确保它采用正确的格式您的控制器操作预期接收数据。

因此,由于您要像 $('#formUserEdit').serialize() 这样提交数据,因此 ajax 会将其序列化为 FormData,并且您的控制器操作应该以相同的格式接收它。

解决方案

将控制器操作从 [FromBody] 更改为 [FromForm] 应该可以工作。

【讨论】:

以上是关于Asp.Net Core Razor Page PUT Handler 模型绑定器未绑定来自 ajax put 上的 java 脚本的序列化表单的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET Core Razor Pages 强制 Anchor Tag Helper (asp-page) 使用小写路由

asp.net core mvc razor page css未在特定路由上加载

如何使用 ASP.NET Core 同时制作 Razor Page 和 C# 代码框架?

如何在 ASP.NET Core Razor Pages 项目的 _layout.cshtml 文件中使用 Razor Page Using Entity Framework 作为部分视图?

ASP.Net Core razor 页面处理程序成为包罗万象的路线

Asp.Net Core Razor Page PUT Handler 模型绑定器未绑定来自 ajax put 上的 java 脚本的序列化表单