【问题标题】:Unable to submit List of model in MVC [duplicate]无法在 MVC 中提交模型列表 [重复]
【发布时间】:2016-02-18 13:21:52
【问题描述】:

我在视图中以编辑模式显示集合中的项目列表。编辑完文件后,我想提交。但我无法回发列表。列表显示为空。

这是我的观点

@model List<NewsLetter.Models.NewsLetterQuestions>



@using (Html.BeginForm("GetAnswersfromUser", "NewsLetter", FormMethod.Post, null))
{
    @Html.AntiForgeryToken()

foreach (var item in Model) {


        <div>
            @Html.DisplayFor(modelItem => item.Question)
        </div>

        <div>
            @Html.TextAreaFor(modelItem => item.Answer)
        </div>

}
       <div class="form-group">
            <div class="col-md-offset-2 col-md-10">
                <input type="submit" value="Submit" class="btn btn-default" />
            </div>
        </div>

}

这是我的控制器

 public ActionResult GetAnswersfromUser(string id)
        {
            id = "56c5afc9afb23c2df08dd2bf";
            List<NewsLetterQuestions> questions = new List<NewsLetterQuestions>();
            var ques = context.NewsLetterQuestionCollection.Find(Query.EQ("NewsLetterId", id));
            foreach(var x in ques)
            {
            questions.Add(x);
            }

            return PartialView(questions);
        }

        [HttpPost]
        public ActionResult GetAnswersfromUser(List<NewsLetterQuestions> nql)
        {

            string id = "56c5afc9afb23c2df08dd2bf";
            foreach (var item in nql)
            {
                var query = Query.And(Query.EQ("NewsLetterId", id), Query.EQ("Question", item.Question));
            var update=Update<NewsLetterQuestions>
                                     .Set(r => r.Answer, item.Answer);
            context.NewsLetterQuestionCollection.Update(query,update);

            }
            return RedirectToAction("NewsLetterIndex");

        }

当我点击提交时,它会抛出错误。

System.NullReferenceException:对象引用未设置为对象的实例。 在行 foreach(nql 中的变量项)

表示nql为空。

【问题讨论】:

  • 我想你忘了添加 id = nql 的输入元素,因此为空。在表单中,您必须使用与模型中相同的 id 元素。
  • @Musketyr 抱歉没听明白你能告诉我哪里出错了。我已将 NewsLetterQuestions 列表作为参数。
  • 您能否检查 POST 请求(Chrome 中的开发人员工具)以查看发布的内容?
  • 您是否尝试将参数 nql 重命名为 newsLetterQuestions?然后,mvc 的魔力应该可以解决剩下的问题。
  • @andreasnico 在控制器中?

标签: c# asp.net asp.net-mvc mongodb


【解决方案1】:

为了使模型绑定器能够绑定发布的数据,您的所有输入名称都需要采用[N].Property 的格式,其中N 是列表中项目的索引。为了让 Razor 正确生成输入名称,您需要向它传递一个索引项,这意味着您需要一个 for 循环,而不是 foreach

@for (var i = 0; i < Model.Count(); i++)
{
    ...

    @Html.TextAreaFor(m => m[i].Answer)

    ...
}

【讨论】:

  • 它起作用了。我怎么忘记了 foreach 是只读的。顺便说一句谢谢你的帮助先生。
【解决方案2】:

您永远不会将列表传递回控制器的 Post 处理程序。您需要将列表路由回控制器。

你应该做一些类似于这个未经测试的代码:)

Html.BeginForm("Index", "Home", new { @nql=Model }, FormMethod.Post)

也看看这篇文章。它与您的问题类似:Pass multiple parameters in Html.BeginForm MVC4 controller action 和这个Pass multiple parameters in Html.BeginForm MVC

【讨论】:

  • 现在没有报错但是nql仍然不包含任何值
  • 哦,为了所有美好和神圣的事物的爱,不,不要将整个模型作为一个可笑的查询字符串参数传递。此外,这甚至不起作用,因为帖子将覆盖查询字符串。
  • @ChrisPratt 我只是给他一个概念,将他需要的项目传回控制器。他显然错过了什么。我没有为他写出确切的代码,而是提供了以前回答的问题的链接,以满足他的需求。
  • 您提供的代码示例绝不会被远程接受。通过查询字符串传递整个模型不仅是错误的形式(并且有潜在的危险),传递的值将是页面加载时的值,不受用户提交的任何内容的影响。再一次,即使那样,帖子本身也会覆盖查询字符串。这只是100%错误。期间。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-09
  • 2020-04-09
相关资源
最近更新 更多