无法在 MVC 中提交模型列表 [重复]

Posted

技术标签:

【中文标题】无法在 MVC 中提交模型列表 [重复]【英文标题】:Unable to submit List of model in MVC [duplicate] 【发布时间】: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 在控制器中? 【参考方案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%错误。期间。

以上是关于无法在 MVC 中提交模型列表 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

MVC 表单无法发布对象列表

.net mvc如何防止用户后退,现在保存订单后能回到订单页面重复提交,如何能防止后退

MVC 5在一个视图上多次提交[重复]

如何在具有相同模型的同一 MVC 页面上重用表单?

在 asp .NET MVC 中提交表单之前动态地将项目添加到列表中

.net 5 MVC 多选列表不以多部分形式返回值