在ASP.NET-MVC 5应用程序中,我有以下模型
class Employee {
int EmployeeID {get;set;}
string FirstName {get;set;}
List<OfficeLocations> OfficeLocations {get;set;}
}
class OfficeLocations {
int OfficeLocationsID {get;set;}
//foreign key
int EmployeeID {get;set;}
string Value1 {get;set;}
string Value2 {get;set;}
}
我有一个编辑视图,用于修改或添加员工可能属于的不同办公地点。它看起来像这样:
@model List<Project.Models.OfficeLocations>
@for (int i = 0; i < Model.Count; i++) {
@Html.EditorFor(m => m[i].CitLocation, new { htmlAttributes = new { @class = "my_editor" } })
@Html.HiddenFor(m => m[i].OfficeLocationsID)
@Html.HiddenFor(m => m[i].EmployeeID)
}
//extra editor box for adding a new value
@Html.Editorfor(??????.Value)
我对如何在数据库表中向模型(列表)中添加新条目感到有些困惑。我将什么放在额外的Editorfor框的参数中(其中所有的????都是
)另外,控制器动作方法会是什么样子?
答案 0 :(得分:1)
更改你的viewmodel以获得一个官方分配和一个官方分配列表......你可以在你额外的编辑框中添加非列表的官方分配对象...或者你可以保留你的viemodel,只需手动创建一个使用jquery建模并使用ajax jquery传递它...
答案 1 :(得分:0)
要解决此问题,我想出了以下javascript:
<script>
$(document).ready(function () {
index = 0;
});
$('#add_button').click(function () {
var placeHolderNameAttribute = "List2[#].Value1";
var indexedNameAttribute = "List2[" + index + "].Value1";
var placeHolderIdAttribute = "new_lastName_input";
var indexedIdAttribute = "new_lastName_input" + index;
document.getElementById(placeHolderIdAttribute).name = indexedNameAttribute;
document.getElementById(placeHolderIdAttribute).id = indexedIdAttribute;
var clone1 = $("#new_lastName_input" + index).clone();
document.getElementById(indexedIdAttribute).name = placeHolderNameAttribute;
document.getElementById(indexedIdAttribute).id = placeHolderIdAttribute;
if (index == 0) {
$('#nlnPlaceHolder').remove();
}
$('#LN_editor_box').append(clone1);
index += 1;
});
</script>
和以下占位符输入字段
<input id="new_lastName_input" class="my_editor" type="text" name="List2[#].Value1" value="New Last Name" />
现在我的控制器post方法接受两个参数,即更新/编辑的值的原始列表,以及仅新值的新列表。
ActionResult myMethod(List<OfficeLocations> list1, OfficeLocations[] list2)
如果值在list1中,那么它将在数据库中更新,如果它在list2中,它将被添加