【问题标题】:Asp.Net MVC. Hot to transmit data from view to controller without datalossASP.NET MVC。 Hot 将数据从视图传输到控制器而不会丢失数据
【发布时间】:2020-01-03 14:24:56
【问题描述】:

我对 asp.net 还很陌生,目前正在尝试制作一个表单来将一些数据添加到我的数据库中。 当我尝试将数据从视图发送到控制器中的 [HttpPost] 方法时,遗憾的是,由于某种原因,我的 POST 中的所有信息都丢失了。为了让您大致了解我的数据结构的外观:我正在开设一门课程,其中包含一个问题对象列表,其中包含一个答案对象列表。 因此,这就是我构建代码的方式。 调用视图:

ViewBag.QuestionId = -1;
return View("QuestionForms", _context.Courses.Include(c => c.Questions.Select(q => q.PossibleAnswers)).Single(c => c.Id == course.Id));

这是视图:

@using System
@using CourseTec.Models
@model CourseTec.Models.Course
@{
    ViewBag.Title = "QuestionForms";
    Layout = "~/Views/Shared/_Layout.cshtml";
}

@using (Html.BeginForm("SaveQuestions", "Course"))
{
var index = ViewBag.QuestionId;

if (Model.Questions != null && index != -1)
{

}
else
{
    Model.Questions.Add(new Question());
    index = Model.Questions.Last().Id;
}
var concreteQuestion = Model.Questions.Find(x => x.Id == index);
var questionIndex = Model.Questions.FindIndex(x => x == concreteQuestion);
<div class="form-group">
    @Html.LabelFor(m => Model.Questions[questionIndex].question)
    @Html.TextAreaFor(m => Model.Questions[questionIndex].question, new { @class = "form-control" })
</div>

for (int k = 0; k < 4; k++)
{
    <div class="form-group">
        @Html.LabelFor(m => Model.Questions[questionIndex].PossibleAnswers[k].AnswerString)
        @Html.TextAreaFor(m => Model.Questions[questionIndex].PossibleAnswers[k].AnswerString, new { @class = "form-control" })
        @Html.CheckBoxFor(m => Model.Questions[questionIndex].PossibleAnswers[k].CorrectAnswer)
    </div>
}

@Html.HiddenFor(m => m.Id);
<button type="submit" class="btn btn-primary">Save</button>
}

而这个是提交后调用的ActionResult

[HttpPost]
public ActionResult SaveQuestions(Course course)
{
    if (course.Id == 0)
    {
        return HttpNotFound();
    }
    else
    {
        var courseInDb = _context.Courses.Include(i => i.Questions.Select(s => s.PossibleAnswers)).Single(c => c.Id == course.Id);
        courseInDb.Questions.Add(course.Questions[0]);
    }

    _context.SaveChanges();
    return View("CourseForms",(_context.Courses.Include(i => i.Questions.Select(s => s.PossibleAnswers)).Single(c => c.Id == course.Id)));
}

有趣的是,第一项可以添加而不会丢失数据或任何其他问题,但尝试添加更多会导致此问题。

因此,如果有人能告诉我为什么 ActionResult 方法无法识别或忽略来自 POST 的数据,我会很高兴。

我想指出,POST 似乎是正确的,如我浏览器中的网络选项卡所示:

【问题讨论】:

  • 能否添加get方法的截图。
  • 请发布实际代码,而不是截图。
  • @3Dave 我做到了,对不起。
  • 请给我们您的Course 类结构。

标签: c# asp.net-mvc


【解决方案1】:

问题是Model.Questions[questionIndex],开始索引应该从0而不是1

你应该把客户名称改正一下,看起来像这样

@Html.TextAreaFor(m => Model.Questions[questionIndex].PossibleAnswers[k].AnswerString, new { @class = "form-control", Name = "Questions["+ k + "].PossibleAnswers["+ k + "].AnswerString" })

【讨论】:

  • 我不确定索引,因为我的数据库中已经有 1 个条目,所以第 1 个索引用于第二个条目。你能解释为什么它需要一个名字来修复它吗?默认情况下,它不应该在没有它的情况下工作并将其放入当前模型中,然后作为 ActionResult 的参数返回给控制器吗?只是要求更好的理解。
  • 它也适用于@Html.TextAreaFor(m =&gt; Model.Questions[0].PossibleAnswers[k].AnswerString, new { @class = "form-control"} 问题是,我总是将 [0] 元素加载到表单中,而不是我要编辑的问题。那么有没有一种动态的方法来将 [x] 元素加载到表单中,同时将工作模型作为参数返回给 ActionResult? (因为它显然需要 [0])
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-09-28
  • 2011-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多