单击提交 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);
}
演示:
可以看到项目可以成功收到回复
这是一个大约有 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);
}
演示:
可以看到项目可以成功收到回复