首页 > 解决方案 > 通过名单模型到 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>

我似乎找不到将模型传递给我的控制器的方法。我想知道每个问题的答案,我想知道是否有人可以帮助我。

//更新

我实际上通过两个修改解决了它:

  1. 像这样绑定输入:[@i].SelectedAnswer而不是@Model[i].SelectedAnswer
  2. 使用 'name' 属性而不是 'asp-for'

标签: asp.netasp.net-core

解决方案


如果您想将表单数据传递给后端,您的请求中的数据格式应如下所示:

[{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);
}

然后你可以在后端获取数据。

在此处输入图像描述


推荐阅读