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

jQuery Ajax传JSON至控制器Reply方法值全为null,仅FormData可用

问题:向Reply控制器方法传递JSON对象时所有值为null,Create方法正常

向控制器的Reply方法传递JSON对象时,表单所有值都为null,但同一控制器的Create方法却能正常接收。仅当使用FormData对象并设置processData: false、contentType: false时,才能成功向Reply方法传值。已尝试JSON.stringify()、设置contentType: 'application/json'、添加dataType: 'json'、更换ViewModel等方法,问题仍未解决。


Create方法相关实现

JavaScript代码:

$('#commentSectionContainer').on('submit', '#comment-form', function (event) { // submit()已废弃,建议使用on('submit')
    event.preventDefault(); // 阻止表单默认提交行为

    let formData = buildFormData();

    $.ajax({
        type: 'POST',
        url: '/Comment/Create',
        contentType: 'application/json',
        data: JSON.stringify(formData),
        success: function (data, textStatus, jqXHR) {
            $('#commentSectionContainer').html(data); // 替换容器内容
        },
        error: function (jqXHR, textStatus, errorThrown) {
            console.log('Error creating comment: ' + errorThrown);
        }        
    });
});
function buildFormData() {
    return {
        text: $('#comment').val(),
        artId: $('#art-id').val(),
        comicId: $('#comic-id').val()
    };
}

HTML代码:

var disableButton = User.Identity.IsAuthenticated ? string.Empty : "disabled";
<form id="comment-form" method="post">
    <label for="comment">Add a comment</label>
    <div class="form-group">
        <label for="comment">Comment</label>
        <textarea class="form-control" id="comment" name="comment" rows="4" style="resize: none; overflow: hidden;"></textarea>
    </div>
    <button type="submit" class="btn btn-primary" @disableButton>Comment</button>
</form>

C#代码:

public async Task<IActionResult> Create([FromBody] CreateCommentViewModel model)
{
// 该model的属性值会被正常填充
}

Reply方法相关实现

JavaScript代码:

$('#commentSectionContainer').on('submit', '#reply-form', function (event) {
        event.preventDefault();
        var commentId = $(this).find('button[type="submit"]').data('id');
        let formData = buildFoo(commentId); // 仅FormData类型的表单有效,JSON对象无效

        $.ajax({
            url: '/Comment/Reply',
            type: 'POST',
            data: formData,
            processData: false,
            contentType: false, // 若设置为'application/json',控制器方法无法读取表单数据
            success: function (data, textStatus, jqXHR) {
                $('#commentSectionContainer').html(data); // 替换容器内容
            },
            error: function (jqXHR, textStatus, errorThrown) {
                console.log('Error creating comment: ' + errorThrown);
            }
        });
    });

function buildFoo(commentId) { // 当前可正常工作
    let formData = new FormData();
    let text = $('#reply-text-' + commentId).val();
    formData.append('Text', text);
    formData.append('ArtId', $('#art-id').val());
    formData.append('ComicId', $('#comic-id').val());
    formData.append('ParentCommentId', commentId);
    return formData;
}

function buildReplyFormData(commentId) { // 最初尝试的方法,无效
    return {
        Text: $('#reply-text-' + commentId).val(),
        ArtId: $('#art-id').val(),
        ComicId: $('#comic-id').val(),
        ParentCommentId: commentId
    };
}

循环内的HTML代码:

<div class="reply-area" id="reply-area-@comment.Id" style="display: none;">
    <form id="reply-form" method="post" data-parentId="@comment.Id">
        <input type="hidden" name="parentId" value="@comment.Id" />
        <div class="form-group">
            <textarea class="form-control" id="reply-text-@comment.Id" name="reply" style="resize: none; overflow: hidden;"></textarea>
        </div>
        <button type="submit" class="btn btn-primary save-btn" data-id="@comment.Id">Comment</button>
        <button type="button" class="btn btn-secondary cancel-reply-btn" data-id="@comment.Id">Cancel</button>
    </form>
</div>

C#代码:

// POST: CommentController/Reply
[HttpPost]
[Authorize]
public async Task<IActionResult> Reply(ReplyCommentViewModel model)
{ // 当传入null的ComicId时,ModelState.IsValid会验证失败
    if (model.ArtId == null && model.ComicId == null)
        return BadRequest();
}

public class ReplyCommentViewModel
{
    [Required]
    [StringLength(1000, MinimumLength = 1)]
    public string Text { get; set; }
    public int? ArtId { get; set; }
    public int? ComicId { get; set; }
    public int ParentCommentId { get; set; }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 13:53:31