MVC5,只需一次提交即可插入或更新数据列表

时间:2014-09-30 00:45:12

标签: c# ajax asp.net-mvc razor

我正在构建一个CBT内容管理器网络应用程序。

我将在每个问题上处理数百个问题列表和4个答案。

顺便说一下,模型如下。

public partial class CbtItem : AldesiMongoBase<CbtItem>
{
        [Browsable(false)]
        public ObjectId id { get; set; }
        public string CbtClass { get; set; }
        public string Inning { get; set; }
        public string Sort { get; set; }
        public string Subject { get; set; }
        public string Question { get; set; }
        public string QuestionImage { get; set; }
        public List<Answer> Answers { get; set; }
}

答案课是......

public partial class Answer
    {
        [BsonIgnore]
        public ObjectId ParentId { get; set; }
        public string Sort { get; set; }
        public string AnswerText { get; set; }
        public string AnswerImage { get; set; }
        public bool IsAnswer { get; set; }
    }

使用这些模型的视图。

@model IEnumerable<Aldesi.Model.CbtItem>

@{
    ViewBag.Title = "input data";
}
    <script type="text/javascript">

        $(document).ready(function (e) {
            $('#ajaxCall').click(function (e) {

            });
        });

    </script>

    <div id="subHeader">
        <h2>@Html.Raw(string.Format("{0} {1} ", Request.Params["cbtclass"], Request.Params["inning"]))</h2>
        <div id="ajaxCall" class="createTestButton aldesi-button">
            <span>
                Submit
            </span>
        </div>
    </div>

    <table class="table">
        <tr>
            <th>
                @Html.DisplayNameFor(model => model.Sort)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.Subject)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.Question)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.QuestionImage)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.Answers)
            </th>
        </tr>

        @foreach (var item in Model)
        {
            <tr class="cbtItems">
                <td>
                    @Html.DisplayFor(modelItem => item.Sort)
                </td>
                <td>
                    @Html.TextBoxFor(modelItem => item.Subject)
                </td>
                <td>
                    @Html.TextBoxFor(modelItem => item.Question)
                </td>
                <td>
                    @Html.TextBoxFor(modelItem => item.QuestionImage)
                </td>

                <td class="ansItems">
                    @if (item.Answers != null)
                    {
                        foreach (var ansItems in item.Answers)
                        {
                            @Html.DisplayFor(modelItem => ansItems.Sort)
                            @Html.TextBoxFor(modelItem => ansItems.AnswerText)
                            @Html.TextBoxFor(modelItem => ansItems.AnswerImage) <br />
                        }
                    }
                </td>
            </tr>
        }
    </table>

}

此视图适用于编辑和列表视图。

我可以通过更新来编辑项目或创建新项目。

我想要做的是只需一次提交即可插入或更新数据列表。

但MVC似乎通过表单提交与服务器通信,所以我认为我需要一个解决方法。

该视图将绘制100个字段和800个答案字段,这些字段将具有相同的ID和名称,这意味着表单提交将只消耗100个中的一个列表。

有什么想法吗? Ajax是最佳人选吗?

2 个答案:

答案 0 :(得分:0)

不要使用foreach循环...使用for循环并遍历集合/列表的索引......

此外,您还需要为模型使用List<T> ... IEnumerable<T>没有索引器,因此您将无法使用它。

@for (int i = 0; i < Model.Count(); i++)
{
    <tr class="cbtItems">
        <td>
            @Html.DisplayFor(modelItem => Model[i].Sort)
        </td>
        <td>
            @Html.TextBoxFor(modelItem => Model[i].Subject)
        </td>
        <td>
            @Html.TextBoxFor(modelItem => Model[i].Question)
        </td>
        <td>
            @Html.TextBoxFor(modelItem => Model[i].QuestionImage)
        </td>

        <td class="ansItems">
            @if (Model[i].Answers != null)
            {
                for (int j = 0; j < Model[i].Answers.Count(); j++)
                {
                    @Html.DisplayFor(modelItem => Model[i].Answers[j].Sort)
                    @Html.TextBoxFor(modelItem => Model[i].Answers[j].AnswerText)
                    @Html.TextBoxFor(modelItem => Model[i].Answers[j].AnswerImage) <br />
                }
            }
        </td>
    </tr>
}

答案 1 :(得分:-1)

对于其他有绑定集合问题的人,

您可以查看BeginCollectionItem帮助器。它为您处理这个问题,并且可以很好地处理具有多个集合的复杂viewModel,处理验证并保持您的视图干净。由于它仍然使用默认的模型绑定器,它将支持普通和ajax帖子。

Git

Nuget

您可以找到大量的文档。它在带有剃刀的MVC5中工作(旧示例中未显示) 示例 - http://blog.stevensanderson.com/2010/01/28/editing-a-variable-length-list-aspnet-mvc-2-style/