单击提交 ASP.NET CORE MVC 时如何从单选按钮获得多个答案

How to get multiple answers from radio buttons when clicking submit ASP.NET CORE MVC

这是一个大约有 40 个问题的测验,每个问题都有多个答案。 一切看起来都很好,直到我尝试从视图中获取控制器的答案,因为一切 returns 0 或 null,请帮忙!

这就是我的 数据库看起来像这样:

模型评估:

namespace ENCB_Placement_Test_Official.Models
{
    public class Evaluacion
    {
        public int ExamenId { get; set; }
        public int RegistroId { get; set; }
        public int ReactivoId { get; set; }
        public string RespuestaAlumno { get; set; }
        public string Pregunta { get; set; }
        public string Respuesta1 { get; set; }
        public string Respuesta2 { get; set; }
        public string Respuesta3 { get; set; }
        public string Respuesta4 { get; set; }
    }
}

带有名为 RepositorioExaluaciones

的 class 服务文件夹
namespace ENCB_Placement_Test_Official.Servicios
{
    public interface IRepositorioEvaluaciones
    {
        Task EnviarRespuesta(Evaluacion evaluacion);
        Task<IEnumerable<Evaluacion>> ObtenerEvaluaciones();
    }
    public class RepositorioEvaluaciones: IRepositorioEvaluaciones
    {
        private readonly string connectionString;
        public RepositorioEvaluaciones(IConfiguration configuration)
        {
            connectionString = configuration.GetConnectionString("DefaultConnection");
        }

        public async Task<IEnumerable<Evaluacion>> ObtenerEvaluaciones()
        {
            using var connection = new SqlConnection(connectionString);
            return await connection.QueryAsync<Evaluacion>(@"SELECT Examenes.Id AS ExamenId,
                                                                                RegistroId,
                                                                                ReactivoId,
                                                                                RespuestaAlumno,
                                                                                Pregunta,
                                                                                Respuesta1,
                                                                                Respuesta2,
                                                                                Respuesta3,
                                                                                Respuesta4
                                                            FROM Examenes 
                                                            INNER JOIN Reactivos
                                                            ON Examenes.ReactivoId = Reactivos.Id
                                                            WHERE Examenes.RegistroId = 1");
        }
        public async Task EnviarRespuesta(Evaluacion evaluacion)
        {
            using var connection = new SqlConnection(connectionString);
            connection.Execute(@"UPDATE Examenes
                                SET RespuestaAlumno = @RespuestaAlumno
                                WHERE RegistroId = @RegistroId", evaluacion);
        }
    }
}

控制器评估

namespace ENCB_Placement_Test_Official.Controllers
{
    public class EvaluacionesController:Controller
    {
        private readonly IRepositorioEvaluaciones repositorioEvaluaciones;

        public EvaluacionesController(IRepositorioEvaluaciones repositorioEvaluaciones)
        {
            this.repositorioEvaluaciones = repositorioEvaluaciones;
        }
        public async Task<IActionResult> Evaluar()
        {
            if (!ModelState.IsValid)
            {
                return View();
            }
            var obtenerExamen = await repositorioEvaluaciones.ObtenerEvaluaciones();
            return View(obtenerExamen);
        }

        [HttpPost]
        public async Task<IActionResult> Evaluar(Evaluacion evaluacion)
        {
            if (!ModelState.IsValid)
            {
                return View(evaluacion);
            }  
            await repositorioEvaluaciones.EnviarRespuesta(evaluacion);
            return View();
        }
    }
}

查看 Evaluar,这是我认为有问题的地方,因为当我调试应用程序并单击提交按钮时,我只得到 null 和 zeros

@model IEnumerable<Evaluacion>
@{
    ViewData["Title"] = "Start Assesment";
    var contador = 1;
}
<h1>Start Assesment</h1>

<div asp-validation-summary="ModelOnly" class="text-danger"></div>
<form asp-action="Evaluar" method="post">
    @foreach (var reactivo in Model)
    {
        <div class="mb-3">
            <label class="form-label">@contador . @reactivo.Pregunta</label>
            <div class="form-check">
                <input class="form-check-input" type="radio" id="@reactivo.ExamenId" name="@reactivo.ExamenId" value="Respuesta1" checked />
                <label class="form-check-label" for="@reactivo.ExamenId">@reactivo.Respuesta1</label>
            </div>
            <div class="form-check">
                <input class="form-check-input" type="radio" id="@reactivo.ExamenId" name="@reactivo.ExamenId" value="Respuesta2" />
                <label class="form-check-label" for="@reactivo.ExamenId">@reactivo.Respuesta2</label>
            </div>
            <div class="form-check">
                <input class="form-check-input" type="radio" id="@reactivo.ExamenId" name="@reactivo.ExamenId" value="Respuesta3" />
                <label class="form-check-label" for="@reactivo.ExamenId">@reactivo.Respuesta3</label>
            </div>
            <div class="form-check">
                <input class="form-check-input" type="radio" id="@reactivo.ExamenId" name="@reactivo.ExamenId" value="Respuesta4" />
                <label class="form-check-label" for="@reactivo.ExamenId">@reactivo.Respuesta4</label>
            </div>
        </div>
        contador++;
    }
    <button type="submit" class="btn btn-primary">Send Response</button>
</form>

它应该 return 像“Respuesta1”这样的答案,它应该存储在 Model.RespuestaAlumno 中,我只是不知道该怎么做。请帮助。

在您的模型设计中,您需要一个 属性 来接收所选答案的值(也许您的模型中已经有了 属性,我不懂西班牙语),所以我创建了 属性:

public class Evaluacion
    {
        public int ExamenId { get; set; }
        public int RegistroId { get; set; }
        public int ReactivoId { get; set; }
        public string RespuestaAlumno { get; set; }
        public string Pregunta { get; set; }
        public string Respuesta1 { get; set; }
        public string Respuesta2 { get; set; }
        public string Respuesta3 { get; set; }
        public string Respuesta4 { get; set; }
        public string Answer { get; set; }
    }

然后在你的视图中,name使用属性名称进行绑定,它要求从索引0开始。我在这里写了一个简单的演示,你可以参考它:

@model IEnumerable<Evaluacion>
@{
    ViewData["Title"] = "Start Assesment";
    var contador = 1;
}
<h1>Start Assesment</h1>

<div asp-validation-summary="ModelOnly" class="text-danger"></div>
<form asp-action="Evaluar" method="post">
    @foreach (var reactivo in Model)
    {
        int i = contador - 1;
        <div class="mb-3">
            <label class="form-label">@contador . @reactivo.Pregunta</label>
            <div class="form-check ">
                <input class="form-check-input" type="radio"  name="[@i].Answer" value="@reactivo.Respuesta1" checked />
                <label class="form-check-label" for="@reactivo.ExamenId">@reactivo.Respuesta1</label>
            </div>
            <div class="form-check">
                <input class="form-check-input" type="radio"  name="[@i].Answer" value="@reactivo.Respuesta2" />
                <label class="form-check-label" for="@reactivo.ExamenId">@reactivo.Respuesta2</label>
            </div>
            <div class="form-check">
                <input class="form-check-input" type="radio"  name="[@i].Answer" value="@reactivo.Respuesta3" />
                <label class="form-check-label" for="@reactivo.ExamenId">@reactivo.Respuesta3</label>
            </div>
            <div class="form-check">
                <input class="form-check-input" type="radio"  name="[@i].Answer" value="@reactivo.Respuesta4" />
                <label class="form-check-label" for="@reactivo.ExamenId">@reactivo.Respuesta4</label>
            </div>
        </div>
        contador++;
    }
    <button type="submit" class="btn btn-primary">Send Response</button>
</form>

最后,从页面传入controller的模型类型是IEnumerable,不能只用Evaluacion接收,需要改成这样:

        [HttpPost]
        public async Task<IActionResult> Evaluar(List<Evaluacion> evaluacion)
        {
            //.......
            return View(evaluacion);
        }

演示:

可以看到项目可以成功收到回复