0

我一直在寻找 SO 和 google 一个多星期了,但仍然无法找到有效的答案。希望有人可以帮助我。

我正在使用 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; }
}

视图由两部分组成,练习部分(工作部分)和答案部分。我想在练习模型的列表中添加更多答案。我尝试过不同的方法。编辑器模板、部分视图等。

这是视图:您可以使用 Jquery 随时随地创建新问题并添加答案。我想要创建的是我可以将答案发布到练习模型中的该列表中。

@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>
}

这可行,但是当我提交页面时,练习模型(类型为 AnswerModel)中的列表保持为空。最后是答案的编辑器模板:

@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 中的列表仍然为空。由于某种原因,我无法通过编辑器模板访问练习模型中的列表。(不包括控制器,因为它现在做的不多而且列表总是空的)

这已经让我忙了一个星期了,希望有人能帮助我吗?

4

1 回答 1

1

我怀疑罪魁祸首在于您的 jQuery 代码,该代码应该动态添加新答案。你还没有展示它,所以很难说它可能有什么问题。

您应该注意的是输入字段的命名约定。Phil Haack 在his blog post本公约中进行了说明。

基本上有两种方法可以动态添加新元素(单击时#btnadd):

  1. 向控制器操作发送 AJAX 调用,该操作将返回包含空模板的局部视图。应该再次尊重命名约定。这里的困难来自于索引。由于命名约定允许您使用非顺序索引(再次阅读 Phil Haack 博客文章),因此这里最简单的方法是使用 Guid 作为索引。Steven Sanderson 说明了这个概念his blog post,甚至展示了一个自定义Html.BeginCollectionItem助手,它就是这样做的。

  2. 纯粹在客户端进行。例如,您可以使用诸如 knockoutjs 之类的框架。Steven Sanderson 再次在his blog post.

所以所以基本上由你来选择你喜欢的方法。但是,无论您在提交表单时选择哪种方法,如果您没有遵守 Answers 输入字段的命名约定,您在控制器操作中得到的所有内容都是空的。

于 2013-04-02T12:19:13.063 回答