【问题标题】:Dynamically add model row to table将模型行动态添加到表中
【发布时间】:2011-06-25 00:55:38
【问题描述】:

我现在已经阅读了很多文章,从 Phil Haacks 的“模型绑定到列表”到 Steve Sanderson 的“编辑可变长度列表”,现在我正在尝试解决我的问题 - 但是我无法真正让它工作.

我有两个模型 - 订单和文章。一个订单有很多文章。订单视图包含一个文章表。

目前,我正在使用我的订单视图模型中的 EditorFor(model => model.Articles) 创建第一个表格行。

它识别 Articles 是一个列表并返回正确的列表项。到目前为止,一切都很好。

现在我想要一个将文章添加到表行的链接,但通过向控制器使用 AJAX 请求,然后返回部分视图(仅包含文章表行)。我已经使用本教程完成了这项工作:http://blog.stevensanderson.com/2010/01/28/editing-a-variable-length-list-aspnet-mvc-2-style/

但是,我的问题是我不知道如何在 ASP.NET MVC“样式”中继续文章行序列,以便在提交时得到识别。 (例如 Articles[1].Number Articles[2].Number 等)

这是我的代码。 “添加文章”链接应添加文章并向 /orders/BlankArticleRow 发送 ajax 请求

public ActionResult BlankArticleRow(int pos)
        {
            Article article = new Article()
            {
                Position = pos
            };

            return View(article);
        }

BlankArticleRow 的部分视图如下所示:

@model Bestellinterface.Models.Article

@{
    Layout = null;
}

@Html.EditorFor(model => model)

工作正常。当我单击“添加文章”链接时,该行被添加,但是文本字段等的属性没有正确的格式。我想要的是它继续对 html 元素进行编号,Articles[0].Number,Articles[1].Number,Articles[2].Number ...

EditorFor 有可能吗?有没有办法模拟一个列表,让它保持编号?

【问题讨论】:

    标签: javascript asp.net-mvc


    【解决方案1】:

    是的,您可以为此使用EditorFor:

        @{ int i = 0; }
    @foreach (var article in Model.Articles)
    {
    @Html.EditorFor(model => Model.Articles[i])
    i++;
    }
    

    假设编辑器模板包含 Title、Description 字段,我们最终会得到 Articles[i].Title、Articles[i].Description。

    您的一个解决方案可能是返回一个包含订单所有文章的部分,这将确保您的索引是正确的。

    或者,您可以使用 javascript 更新输入的索引。

    为了在从动态表中删除项目时保持索引正确,我编写了以下内容:

    //reset index values
    $('#links-table tbody tr').each(function (index, value) {
        $(this).find('input[type=text]').prop('name', function (i, e) { return e.replace(/(\d+)/g, index) });
    });
    

    这会在每个输入的名称中查找索引,例如Articles[2].Title 并将其替换为新索引。您可能会在成功调用 ajax 时执行类似的操作。

    希望有所帮助 本

    【讨论】:

    • 你好 Ben,我应该把代码放在哪里?我只是问,因为我的 OrderViewModel 已经包含这样的代码来呈现文章并且它工作正常 - 我的问题是部分视图,它应该只呈现该表行。我真正在寻找的是 EditorFor 的一个参数,它强制 EditorFor 以“列表样式”呈现输入,但 AFAIK 那是不可能的,所以我可能会坚持使用 javascript 解决方案。
    【解决方案2】:

    我认为你错过了史蒂夫创建的扩展

    如果你看这篇文章,它是这样使用的:

    <% using(Html.BeginCollectionItem("gifts")) { %>
        Item: <%= Html.TextBoxFor(x => x.Name) %> 
        Value: $<%= Html.TextBoxFor(x => x.Price, new { size = 4 }) %> 
    <% }
    

    【讨论】:

    • 不幸的是,Steve Sanderson 创建的扩展对我没有帮助,因为它会为每个“行”生成一个随机 ID。该教程还说生成以下序列需要更多工作(但这就是我需要的)
    • 我不确定我是否遵循...它会生成一个随机值,但只有这样 MVC 才能一起跟踪这些值。如果您的意思是在数据库级别生成 ID,那么这将不是问题。我已经在 Identity 列中使用了这种技术......
    • 只是为了澄清......扩展生成的值与您用于保存在数据库中的 ID 不同..
    猜你喜欢
    • 2015-08-28
    • 2012-07-16
    • 1970-01-01
    • 1970-01-01
    • 2021-05-14
    • 2023-03-26
    • 2014-08-05
    • 2014-09-06
    • 2018-01-26
    相关资源
    最近更新 更多