无法在 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 中提交模型列表 [重复]的主要内容,如果未能解决你的问题,请参考以下文章
.net mvc如何防止用户后退,现在保存订单后能回到订单页面重复提交,如何能防止后退