我一直在寻找SO和谷歌一个多星期了,仍然无法找到合适的答案。希望有人可以帮助我。
我正在使用asp.net(Entity Framework + Razor)开发一个项目,我正在尝试向视图中添加两个模型。它使用editorFor()显示完美。现在问题是某些部分没有将信息传递给控制器。
在这种情况下,每次练习都得到了一些答案。这是我的运动模式:
Table("Exercise")]
public class ExerciseModel
{
[Key]
public int ExerciseId { get; set; }
[Required]
public string Question { get; set; }
[Required]
public List<AnswerModel> Answers { get; set; }
这就是答案模型:
[Table("Answer")]
public class AnswerModel
{
[Key]
public int AnswerId { get; set; }
[Required]
public string Answer { get; set; }
}
视图由两部分组成,即练习部分(工作部分)和答案部分。我想在exercisemodel的列表中添加更多答案。我尝试过不同的方法。编辑模板,部分视图等。
这是观点: 您可以使用Jquery创建一个新问题并随时添加答案。我想创建的是我可以在exercisemodel中将答案发布到该列表中。
@using (Html.BeginForm("CreateQuestion", "Admin", FormMethod.Post))
{
@Html.ValidationSummary(true)
//will be changed
@Html.Partial("_PartialCreateExercise")
//this shows the answers form
<div style="display: none;" id="new">
<div class="editor-field">
@Html.EditorFor(m => m.Answers);
</div>
</div>
<p>
<input name="command" type="button" id="add" value="add new answers" />
</p>
<p>
<input name="command" type="submit" value="Create" />
</p>
}
这样可行,但是当我提交页面时,在exercisemodel(类型为AnswerModel)中的List仍为空。最后是答案的编辑模板:
@model Academy.Models.AnswerModel
@{
Layout = null;
}
<h2>Answer</h2>
<p>
@Html.LabelFor(model => model.Answer)
@Html.EditorFor(model => model.Answer)
</p>
The jQuery:
$(document).ready(function () {
$("#add").click(function () {
$('#add').after($("#new").html());
$('#new').css("Display", "block");
});
});
它并没有那么多,并且在那里尝试了很多,所以它变得凌乱。但是当使用调试模式时,ExerciseModel中的List是空的,也是AnswerModel。
再次,问题是在发布表单时,ExerciseModel中的List仍为空。由于某种原因,我无法通过编辑器模板在exercisemodel中找到List。 (控制器不包括在内,因为它现在没有做很多事情而且List总是空的)
这让我忙了一个星期,希望有人可以帮助我吗?
答案 0 :(得分:1)
我怀疑罪魁祸首在于你的jQuery代码,那个应该动态添加新答案的代码。你没有表现出来,所以很难说出它可能有什么问题。
您应该注意的是输入字段的命名约定。 Phil Haack在his blog post
这个大会上说明了这一点。
基本上有2种动态添加新元素的方法(点击#btnadd
时):
向控制器操作发送AJAX调用,该操作将返回包含空模板的部分视图。应再次尊重命名惯例。这里的困难来自索引。由于命名约定允许您使用非顺序索引(再次阅读Phil Haack博客文章),最简单的方法是使用Guids作为索引。 Steven Sanderson在his blog post
中说明了这个概念,甚至还展示了一个自定义的Html.BeginCollectionItem
帮助器。
纯粹在客户端进行。例如,您可以使用诸如knockoutjs之类的框架。 Steven Sanderson再次在his blog post
中阐述了这一概念。
所以基本上你可以选择你喜欢的方法。但是,无论您在提交表单时选择哪种方法,如果您没有遵守Answers输入字段的命名约定,您在控制器操作中获得的所有内容都将为null。