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

Asp.net Core PartialView中添加答案按钮意外提交表单问题

问题描述

我使用ASP.NET Core搭建测验网站,需要实现创建测验、为测验添加题目、为题目添加答案的功能。目前添加题目按钮可正常工作,但添加答案按钮未执行添加答案操作,反而提交了表单。

实体类代码

Answer类

public class Answer
{
    [Key]
    public Guid Id { get; } = Guid.NewGuid();
    public string Content { get; set; }
    public Guid QuestionId { get; set; }
}

Question类

public class Question
{
    [Key]
    public Guid Id { get; } = Guid.NewGuid();
    public string Content { get; set; }
    public Guid QuizId { get; set; }
    public ICollection<Answer> Answers { get; set; } = new List<Answer>() { 
        new Answer() { Content = "Answeeeer" }, 
        new Answer() { Content = "Answeeeer2" },
        new Answer() { Content = "Answeeeer3" }
    };
}

Quiz类

public class Quiz
{
    [Key]
    public Guid Id { get; } = Guid.NewGuid();
    public string Name { get; set; }
    public ICollection<Question> Questions { get; set; } = new List<Question>() { };
}

前端局部视图

Question局部视图

@model QuizIt_Tests.Entities.Question

<hr style="height: 4px; color: black;" />
<div class="w-100 p-3 px-5 my-3">
    <label asp-for="Content" class="control-label">Question</label>
    <input asp-for="Content" class="form-control" value="@Model.Content" />
    <span asp-validation-for="Content" class="text-danger"></span>
    <div id="answerRows @Model.Id" class="w-75"> 
        @Html.EditorFor(model => model.Answers)
        <button class="btn btn-primary" id="addAnswer @Model.Id">Add Answer</button>
    </div>
</div>

@section Scripts {
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.1/jquery.min.js"></script>
    <script src="jquery-3.6.1.min.js"></script>
    <script>
        $("#addAnswer " + @Model.Id).click(function () {
            console.log("clicked");
            $.ajax({
                url: '@Url.Action("AddBlankQuestion", "Quizes")',
                cache: false,
                success: function (html) {
                    $("#answerRows " + @Model.Id").append(html); },
                                            error: function (xhr, status, error) {
                        console.log(xhr.responseText);
                    }
                });
            return false;
        });
    </script>
}

Answer局部视图

@model QuizIt_Tests.Entities.Answer

<div class="row" style="background-color:red; margin: 20px;">
    <label asp-for="Content" class="control-label">Answer Content</label>
    <input asp-for="Content" class="form-control" value="@Model.Content" />
    <span asp-validation-for="Content" class="text-danger"></span>
</div>

控制器代码

public class QuizesController : Controller
{
    private readonly ApplicationDBContext _context;

    public QuizesController(ApplicationDBContext context)
    {
        _context = context;
    }

    public IActionResult AddBlankQuestion(Quiz model)
    {
        Question question = new Question(); 
        return PartialView("EditorTemplates/Question", question);
    }
    public IActionResult AddBlankAnswer(Question model)
    {
        return PartialView("EditorTemplates/Answer", new Answer() { QuestionId = model.Id });
    } 
}

问题修复方案

1. 修正按钮和容器的ID格式

元素ID包含空格会导致jQuery选择器解析错误,将空格替换为连字符:

<!-- 修改容器ID -->
<div id="answerRows-@Model.Id" class="w-75"> 
    @Html.EditorFor(model => model.Answers)
    <!-- 修改按钮ID -->
    <button class="btn btn-primary" id="addAnswer-@Model.Id">Add Answer</button>
</div>

2. 修正AJAX请求的Action和参数

当前AJAX错误调用了添加题目的AddBlankQuestion,应改为调用添加答案的AddBlankAnswer,并传递当前Question的ID:

@section Scripts {
    <!-- 只保留一个jQuery引入,避免冲突 -->
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.1/jquery.min.js"></script>
    <script>
        $("#addAnswer-@Model.Id").click(function (event) {
            // 明确阻止按钮的默认表单提交行为
            event.preventDefault();
            console.log("clicked");
            $.ajax({
                url: '@Url.Action("AddBlankAnswer", "Quizes")',
                type: 'GET',
                // 传递Question的ID给控制器
                data: { id: '@Model.Id' },
                cache: false,
                success: function (html) {
                    $("#answerRows-@Model.Id").append(html);
                },
                error: function (xhr, status, error) {
                    console.log(xhr.responseText);
                }
            });
        });
    </script>
}

3. 调整控制器的AddBlankAnswer方法

修改方法参数,直接接收Question的ID,无需绑定整个Question模型:

public IActionResult AddBlankAnswer(Guid id)
{
    return PartialView("EditorTemplates/Answer", new Answer() { QuestionId = id });
}

4. 移除重复的jQuery引入

局部视图中同时引入了CDN和本地的jQuery文件,会导致脚本冲突,保留其中一个即可。

内容的提问来源于stack exchange,提问作者Mətin Abaszadə

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 08:01:56