向MVC中的嵌套集合添加更多项
Adding more items to nested collections in MVC?
我有两个模型,employees1
和phone_manager
。Employees1
有一个名为employee_phone_manager
的集合,其中包含与员工ID匹配的所有行。
根据在线教程,我将两个模型集成在一起,以便我可以动态地从创建视图中添加和删除项。在我的编辑视图中,我可以编辑或删除电话号码,但不能添加。我发现的第一件事是,员工ID没有填充到动态添加的项上,因此我修改了HTML帮助器以插入适当的员工ID,这纠正了我得到的关于外键约束和引用完整性约束的问题。但是,它似乎并没有实际将项插入到集合中。
这是我的编辑控制器的邮政编码:
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit([Bind(Include = "employee_id,assigned_id,all_id,first_name,last_name,birth_day,gender,social,address_line_1,address_line_2,city,state,zip,hire_date,termination_date,emergency_contact_name,emergency_contact_phone,notes,employee_phone_manager")] employees1 employees1)
{
if (ModelState.IsValid)
{
db.Entry(employees1).State = EntityState.Modified;
db.SaveChanges();
foreach (var item in employees1.employee_phone_manager)
{
if (item.phone_id == 0 && !item.deleted)
{
db.phone_manager.Add(item);
}
else if (item.phone_id != 0)
{
db.Entry(item).State = EntityState.Modified;
db.SaveChanges();
}
}
return RedirectToAction("Index");
}
ViewBag.phonetype = new SelectList(db.phone_types, "phone_type_id", "phone_type_name");
ViewBag.all_id = new SelectList(db.all_employees, "all_id", "all_id", employees1.all_id);
return View(employees1);
}
And my View
<div class="box border blue">
<div class="box-title">
<h4><i class="fa fa-phone"></i>Phone Number</h4>
<div class="tools">
<a href="javascript:;" class="collapse">
<i class="fa fa-chevron-up"></i>
</a>
@Html.RemoveLink("<i class='"fa fa-times'"></i>", "div.phoneNumber", "input.mark-for-delete")
</div>
</div>
<div class="box-body">
@Html.HiddenFor(x => x.phone_id)
@Html.HiddenFor(x => x.employee_id)
<div class="form-group">
@Html.LabelFor(x => x.phone_type, new { @class = "control-label col-md-3" })
@Html.DropDownListFor(x => x.phone_type, (SelectList)ViewBag.phonetype, new { @class = "form-control" })
</div>
<div class="form-group">
@Html.LabelFor(x => x.phone_number, new { @class = "control-label col-md-3" })
@Html.TextBoxFor(x => x.phone_number, new { @class = "phone form-control", size = "10" })
</div>
<div class="form-group">
@Html.LabelFor(x => x.phone_extension, new { @class = "control-label col-md-3" })
@Html.TextBoxFor(x => x.phone_extension, new { size = "4", @class = "form-control" })
</div>
@Html.HiddenFor(x => x.date_added, new { @Value = System.DateTime.Now })
@Html.HiddenFor(x => x.deleted, new { @class = "mark-for-delete" })
</div>
</div>
和HTML Helper
public static IHtmlString AddLink<TModel>(this HtmlHelper<TModel> htmlHelper, string linkText, string containerElement, string counterElement, string collectionProperty, Type nestedType, string empID = "0")
{
var ticks = DateTime.UtcNow.Ticks;
var nestedObject = Activator.CreateInstance(nestedType);
var partial = htmlHelper.EditorFor(x => nestedObject).ToHtmlString().JsEncode();
partial = partial.Replace("id='''"nestedObject", "id='''"" + collectionProperty + "_" + ticks + "_");
partial = partial.Replace("id='''"nestedObject", "id='''"" + collectionProperty + "_" + ticks + "_");
partial = partial.Replace(".employee_id'''" type='''"hidden'''" value='''"0", ".employee_id'''" type='''"hidden'''" value='''"" + empID);
var js = string.Format("javascript:addNestedForm('{0}','{1}','{2}','{3}');return false;", containerElement, counterElement, ticks, partial);
TagBuilder tb = new TagBuilder("a");
tb.Attributes.Add("href", "#");
tb.Attributes.Add("onclick", js + ";addMasks();");
tb.Attributes.Add("class", "addNewItemsLink");
tb.InnerHtml = linkText;
var tag = tb.ToString(TagRenderMode.Normal);
return MvcHtmlString.Create(tag);
}
private static string JsEncode(this string s)
{
if (string.IsNullOrEmpty(s)) return "";
int i;
int len = s.Length;
StringBuilder sb = new StringBuilder(len + 4);
string t;
for (i = 0; i < len; i += 1)
{
char c = s[i];
switch (c)
{
case '>':
case '"':
case '''':
sb.Append('''');
sb.Append(c);
break;
case ''b':
sb.Append("''b");
break;
case ''t':
sb.Append("''t");
break;
case ''n':
break;
case ''f':
sb.Append("''f");
break;
case ''r':
break;
default:
if (c < ' ')
{
string tmp = new string(c, 1);
t = "000" + int.Parse(tmp, System.Globalization.NumberStyles.HexNumber);
sb.Append("''u" + t.Substring(t.Length - 4));
}
else
{
sb.Append(c);
}
break;
}
}
return sb.ToString();
}
}
任何帮助都非常感谢!谢谢!
经过几个小时的修修补补,我终于知道我做错了什么!事实证明我真的应该读一些文档。EntityState
有几个不同的属性,其中一些是Modified
, Added
和Deleted
。通过指定这些状态之一,我可以直接从edit方法中插入和删除。
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit(employees1 employees1)
{
if (ModelState.IsValid)
{
foreach (var item in employees1.employee_phone_manager)
{
if (item.deleted)
{
db.Entry(item).State = EntityState.Deleted;
}
else if (item.phone_id == 0)
{
db.Entry(item).State = EntityState.Added;
}
else
{
db.Entry(item).State = EntityState.Modified;
}
db.SaveChanges();
}
db.Entry(employees1).State = EntityState.Modified;
db.SaveChanges();
return RedirectToAction("Index");
}
ViewBag.phonetype = new SelectList(db.phone_types, "phone_type_id", "phone_type_name");
ViewBag.all_id = new SelectList(db.all_employees, "all_id", "all_id", employees1.all_id);
return View(employees1);
}
相关文章:
- Meteor-将选定窗体中的对象添加到集合中
- 将css属性添加到对象的集合中
- 添加/更改模型后重新影响和渲染集合
- 主干.js绑定到集合“添加”呈现视图两次
- MongoDB:如何将这个散列添加到集合中的每个文档中
- 如何在集合中添加集合
- 如何将中的两个geoJSON功能集合添加到两个层组中
- 主干:从集合视图向集合添加模型
- 向扩展数组的JS集合添加对象(继承?)
- 为什么我的骨干.js集合重置只是添加 1 个模型
- Lodash:如何向集合中的所有值添加新字段
- Accounts.onCreateUser 未将字段添加到 Meteor 的用户集合中
- 如何按顺序将类添加到元素集合
- 流星 - 将投票添加到集合中的特定 ID
- 主干.js:仅添加来自 JSON 集合获取的新模型
- 主干:集合将随机模型添加到自身
- 将模型添加到木偶项视图定义之外的主干集合
- 瓦坎达添加集合
- 如何在javascript中添加集合中的动态项
- 在集合中添加集合