You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET5环境下如何通过AJAX将Razor视图的Model传递到控制器

问题核心原因

  1. 控制器接收参数类型与前端发送的JSON结构不匹配:前端发送的是包含Name/Subject/EmailAddress/MessageBody四个字段的JSON对象,但控制器设置的是接收单个字符串参数data,类型不匹配自然无法完成绑定,最终得到null值
  2. 表单元素选择器可能失效:你的input通过asp-for="IndexEmail.Name"生成,默认生成的id为IndexEmail_Name,如果没有手动设置id="displayname",$("#displayname")会取不到值,导致提交的JSON本身就包含null字段

正确修改步骤

1. 调整控制器接收逻辑

把接收参数改为你定义的IndexEmail类型,加上[FromBody]特性,让ASP.NET Core自动把请求体的JSON反序列化为对应模型:

[HttpPost]
public async Task<JsonResult> SendGrid_SendEmail([FromBody] IndexEmail data)
{
    // 这里可直接读取data.Name、data.Subject等属性的值
}

2. 修正AJAX发送逻辑

优先用第一种AJAX写法,调整选择器避免id不匹配问题:

function SendEmail() {
    if ($("form").valid()) {
        // 用name属性选择表单值,避免id不匹配问题
        var postData = {
            Name: $("input[name='IndexEmail.Name']").val(),
            Subject: $("input[name='IndexEmail.Subject']").val(),
            EmailAddress: $("input[name='IndexEmail.EmailAddress']").val(),
            MessageBody: $("textarea[name='IndexEmail.MessageBody']").val()
        };
        $("body").addClass("loading");
        $.ajax({
            type: "POST",
            url: "/Ajax/SendGrid_SendEmail",
            data: JSON.stringify(postData),
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            error: function (xhr, status, error) {
                console.log(error);
            }
        }).done(function (data) {
            $("body").removeClass("loading");
        });
    }
}

可选简化方案:直接序列化表单

如果表单所有字段的name属性和IndexEmail的字段完全对应,可直接序列化表单,无需手动拼接每个字段:

var formData = $("form").serializeArray();
var postData = {};
formData.forEach(item => {
    postData[item.name.replace("IndexEmail.","")] = item.value;
});
// 后续直接JSON.stringify(postData)发送即可

内容的提问来源于stack exchange,提问作者Ahmad Hassan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 03:18:03