如何使用 mvc 中的部分视图将唯一 ID 分配给动态添加的行

how to assign unique id's to dynamically added row using partial views in mvc

过去也有人问过类似的问题,但我发现很难找到这个问题的解决方案。

我有一个简单的局部视图如下

@model MemberSiteAddressModel
<tr>
    <td>@Html.EditorFor(x => x.Site) </td>
    <td>@Html.EditorFor(x => x.AddressLine1)</td>
    <td>@Html.EditorFor(x => x.AddressLine2)</td>
    <td>@Html.EditorFor(x => x.City)</td>
    <td>@Html.EditorFor(x => x.PostCode)</td>
</tr>

我的主视图通过 ajax 调用加载局部视图,如下所示。我需要为任何新添加的行(因为我需要在任何选定的行上添加更多详细信息)和字段提供唯一 ID,以便我可以使用模型活页夹

<table id="businessSitesTable" class="table table-responsive">
   <tr>
    <th>Site Name</th>
    <th>Address Line 1</th>
    <th>Address Line 2</th>
    <th>City</th>
    <th>PostCode</th>
  </tr>
 </table>

<script>
function LoadPartial() {
        $.ajax({
            type: "GET",
            url: "/Home/AddNewRow",
            content: "application/html; charset=utf-8",
            success: function(data) {                   
                $("#sitesTable").append(data);
            },
            error: function(xhr, textStatus, errorThrown) {

            }
        });
}

<input id="addBtn" type="button" value="Add Row" onclick="LoadPartial(); return false;" /> 

您不妨从客户端模板开始(您克隆的隐藏行)。您正在 Ajax- 获得一组 空控件 ,这非常浪费。

由于您没有 post 返回整个 table,我假设一次只返回一行,您根本不需要字段上的 ID,只需要名称。

使用 @Html.Partial 内联呈现单个模板虚拟记录,或者直接将您想要的 HTML 插入模板:

<table id="template" style="display:none">
    <tr>
        <td><input name="Site"/></td>
        <td><input name="AddressLine1"/></td>
        <td><input name="AddressLine2"/></td>
        <td><input name="City"/></td>
        <td><input name="PostCode"/>)</td>
        <td><input type="button" class="saverow" value="Save"/></td>
    </tr>
</table>

注意:如果您决定通过 @Html.Partial 注入,因为它使用 EditorFor,您将需要从克隆中完全删除 ID。

然后在添加按钮按下时像这样使用:

function LoadPartial() {
    $("#sitesTable").append($('#template').html());
}

save 选项(您未显示)然后应将行中的所有输入和 Ajax post 作为 data 属性.这使用了一个委托事件处理程序,附加到一个不变的祖先元素。

$(document).on('click', '.saverow', function(){
     vare $tr = $(this).closest('tr');
     // $ajax put call of the current row's fields here
});

选择器在 事件时间 运行,因此它将与动态元素一起使用。

注意:请不要将内联事件处理程序与 jQuery 混合使用。只需执行事件 "the JQuery way",这样 事件注册 就不会与 事件处理程序 :

分开
 $('#addBtn').click(function(){
     $("#sitesTable").append($('#template').html());
 });

这比内联处理程序更容易维护,并且支持多个处理程序和其他很酷的 jQuery 事件功能 :)

你在这里使用 "id" 令人困惑,因为我真的认为你在谈论列表的索引。如果您希望能够实际接收为这些动态添加的项目发布的值,则必须正确索引输入名称。我没有你的视图模型可以使用,但一般来说生成的 HTML 必须看起来像:

<input type="text" name="BusinessSites[0].Site" />

您将遇到的主要问题是在从页面中添加/删除项目时保持此索引更新。要尽可能轻松高效地执行此操作,您应该使用一些可以处理模型绑定的客户端库 HTML(Knockout、Angular 等),或者您可以使用非顺序索引作为Phil Haack's post Model Binding to a List.

中描述