asp.net - 通过名单模型到 ASP.NET Core 中的控制器
问题描述
我的 Web 应用程序中有一个用于评估的表单,它有几个问题,每个问题,几个答案应该由用户选择(单选按钮)。
我的模型看起来像:
public class EvaluationQuestionModel
{
public int Id { get; set; }
public string Title { get; set; }
public List<EvaluationAnswerModel> Answers { get; set; }
public int SelectedAnswer { get; set; }
}
(和我的答案模型:
public class EvaluationAnswerModel
{
public string Title { get; set; }
public int Grade { get; set; }
}
)
我的观点是:
@model List<EvaluationQuestionModel>
<form asp-controller="EvaluationQuestions" asp-action="SubmitSurvey">
@for (int i = 0; i < Model.Count(); i++)
{
<div class="row">
<div class="col-lg-12 col-md-12 col-sm-12 col-12">
<label>@Model[i].Title</label>
</div>
<div class="col-lg-12 col-md-12 col-sm-12 col-12">
@for (int j = 0; j < Model[i].Answers.Count; j++)
{
<div class="form-check form-check-inline">
<input class="form-check-input" asp-for="@Model[i].SelectedAnswer" name="@Model[i].Id" type="radio" value="@Model[i].Answers[j].Grade">
<label asp-for="@Model[i].Answers[j].Title" class="form-check-label">@Model[i].Answers[j].Title</label>
</div>
}
</div>
</div>
<hr />
}
<div class="row no-block d-flex justify-content-center">
<input type="submit" value="Submit">
</div>
</form>
我似乎找不到将模型传递给我的控制器的方法。我想知道每个问题的答案,我想知道是否有人可以帮助我。
//更新
我实际上通过两个修改解决了它:
- 像这样绑定输入:
[@i].SelectedAnswer
而不是@Model[i].SelectedAnswer
- 使用 'name' 属性而不是 'asp-for'
解决方案
如果您想将表单数据传递给后端,您的请求中的数据格式应如下所示:
[{Id:1,SelectedAnswer:1},{Id:2,SelectedAnswer:2},{Id:3,SelectedAnswer:3}]
然后你可以得到列表模型FromForm
,比如
public async Task<IActionResult> SubmitSurvey([FromForm] List<EvaluationQuestionModel> data){}
提示
您需要确保 http 请求中的属性与后端中的模型相同,它将正常工作。
我创建了您提供的示例代码并对其进行测试,我看到了数据。
我的解决方案
我可以 foreach IFormCollection
,然后将它们转换为列表。
[HttpPost]
public async Task<IActionResult> SubmitSurvey(IFormCollection formCollection)
{
List<EvaluationQuestionModel> data = new List<EvaluationQuestionModel>();
foreach (var item in formCollection)
{
if (item.Key != "__RequestVerificationToken")
{
EvaluationQuestionModel e = new EvaluationQuestionModel();
e.Id = int.Parse(item.Key);
e.SelectedAnswer = int.Parse(item.Value);
data.Add(e);
}
}
return Ok(data);
}
然后你可以在后端获取数据。
推荐阅读
- sql - 如何在 Bash 脚本中自动引用 SQL INSERT STATEMENT 的“字符串值”
- php - web dev - 服务器未指向 laravel 7.3 public,显示“/索引”页面
- r - R For循环,多变量和多维
- php - PHP socket_read 等待数据读取
- java - 使用 Spark 读取 Kudu 表时出现问题(带有 Apache Toree 的 Jupyer Notebook - Scala Kernel)
- javascript - 使用页面可见性 api 重定向
- java - 定义生成类jax-ws ws:import的根包,而不是override
- apache-spark-sql - Spark SQL 中的广播连接
- node.js - 使用 Postgresql 的 Passport js 本地策略不起作用
- javascript - 向循环添加超时延迟