【问题标题】:Adding more items to nested collections in MVC?向 MVC 中的嵌套集合添加更多项目?
【发布时间】:2014-05-02 16:57:29
【问题描述】:

我有 2 个模型,employees1 和 phone_manager。 Employees1 有一个名为 employee_phone_manager 的 ICollection,其中包含具有匹配员工 ID 的所有行。

Following a tutorial online,我将这两个模型集成在一起,以便我可以从我的创建视图中动态添加和删除项目。在我的编辑视图中,我可以编辑或删除电话号码,但不能添加。我发现的第一件事是员工 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);
    }

我的观点

<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 助手

    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();
    }
}

非常感谢任何帮助!谢谢!

【问题讨论】:

    标签: c# javascript asp.net-mvc entity-framework


    【解决方案1】:

    经过几个小时的修补,我终于弄清楚我做错了什么!事实证明我真的应该阅读一些文档。 EntityState 有几个不同的属性,其中一些是Modified、Added 和Deleted。通过表示其中一种状态,我可以直接从编辑方法中插入和删除。

        [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);
        }
    

    【讨论】:

      猜你喜欢
      • 2022-01-24
      • 1970-01-01
      • 2012-09-05
      • 2022-10-13
      • 1970-01-01
      • 2016-05-16
      • 1970-01-01
      • 1970-01-01
      • 2020-05-31
      相关资源
      最近更新 更多