Вставьте несколько строк данных в несколько таблиц в виде одной страницы перед отправкой и сохраните в БД в ASP.NET MVC - PullRequest
0 голосов
/ 27 мая 2018

Я пытаюсь создать форму заявки в виде одностраничного веб-приложения в asp.net mvc.Я новичок в этом и был бы очень признателен за любую помощь, поскольку я исследовал эту проблему в течение многих дней безрезультатно.

Форма начинается с некоторых личных данных о пользователе, а затем я создал несколько пустых jqueryDatatables (без плагина редактора) с функциональностью CRUD, которые все имеют внешний ключ к FormId (основная форма).Таким образом, пользователь может вставить туда языки, на которых он говорит, прошлый опыт работы, навыки и многое другое.Затем они могут приступить к заполнению некоторой дополнительной информации в свободном текстовом поле, применить свое резюме и, наконец, отправить форму для сохранения данных в базу данных.

Проблема в том, что я не могу сохранить что-либо в Datatables, потому что я получаю "INSERT STATEMENT CONFLICTED OF FK CONSTRAINT "ошибка, которая, вероятно, звучит логично, поскольку я пытаюсь вставить дочерние таблицы, не отправив пользователя первым, чтобы получить идентификатор FormId.

Каков наилучший способ решить эту проблему?Мне нужно, чтобы эта форма была заполнена сверху вниз без промежуточных кнопок «Далее».Одна страница.И иметь возможность добавлять вещи в дочерние таблицы, которые ссылаются на Заявителя.

Возможно ли это как-то?

Забыл упомянуть, что использовал первый подход к базе данных EF.

DB

**Applicant tbl**
----------
FormId (PK)
FirstName
LastName
Address
Country
Email
MoreInfo
//

**WorkExp tbl**
------------
WorkExpId (PK)
FormerEmployer
Position
From
To
FormId (FK)

//more tables same like WorkExp one

Некоторыемоего кода ниже.

@ модель Applicant.cs

public partial class Applicant
    {

        public Applicant()
        {

            this.WorkExps = new HashSet<WorkExp>();
        }

        public int FormId { get; set; } 
        public string Title { get; set; }
        public string LastName { get; set; }
        public string FirstName { get; set; }
        public DateTime DateofBirth { get; set; }
        public string Address { get; set; }
     //more properties
        public string ContactEmail { get; set; }
        public string MoreInfo { get; set; }
        public string CV { get; set; }
        public string hasAgreed { get; set; }
        public string ApplyPosition { get; set; }


        public virtual ICollection<WorkExp> WorkExps { get; set; }
//mode child tables
    }
}

@ model WorkExp.cs

public partial class WorkExp
    {
        public int WorkExpId { get; set; }
        public System.DateTime From { get; set; }
        public System.DateTime To { get; set; }
        public string Employer { get; set; }
        public string Position { get; set; }
        public string Description { get; set; }
        public int FormId { get; set; }

        public virtual Applicant Applicant { get; set; }
    }
}

ApplicantViewModel.cs

public class ApplicantViewModel
    {

        public string Title { get; set; }
        public string LastName { get; set; }
        public string FirstName { get; set; }
        public DateTime DateofBirth { get; set; }
        public string Address { get; set; }
        public string Postcode { get; set; }
        public string City { get; set; }
        public string Country { get; set; }
        public string Phone { get; set; }
        public string ContactEmail { get; set; }
        public string MoreInfo { get; set; }
        public DateTime From { get; set; }
        public DateTime To { get; set; }
        public string Employer { get; set; }
        public string Position { get; set; }
        public string Description { get; set; }
    }

WorkExp Controller

[HttpPost]
public ActionResult Create([Bind(Include = "WorkExpId,From,To,Employer,Position,Description,FormId")] ApplicantViewModel model)
        {

            var applicant = new Applicant //i could/should add this to Applicant Controller class instead?
            {

                FirstName = model.FirstName,
                LastName = model.LastName,
                Title = model.Title,
                DateofBirth = model.DateofBirth,
                Address = model.Address,
                Country = model.Country,
                Postcode = model.Postcode,
                City = model.City,
                Phone = model.Phone,
                ContactEmail = model.ContactEmail,
                MoreInfo = model.MoreInfo,



            };

            var workexp = new WorkExp
            {

                FormId = applicant.FormId,
                From = (DateTime)model.From,
                To = (DateTime)model.To,
                Description = model.Description,
                Employer=model.Employer,
                Position=model.Position



            };

            if (ModelState.IsValid)
            {
                db.Applicants.Add(applicant); //works but creates null entries of applicants to db
                workexp.WorkExpId = applicant.FormId;
                db.WorkExps.Add(workexp);
                db.SaveChanges();
                return Json(new { success = true, message = "Αποθηκεύτηκε με επιτυχία" }, JsonRequestBehavior.AllowGet);
            }

            ViewBag.FormId = new SelectList(db.Applicants, "FormId", "ContactEmail", workexp.FormId);
            return View(workexp);
        } 

Создать представление

@using CareerForm.Models
@model CareerForm.Models.WorkExp

@{
    Layout = null;
}


@using (Html.BeginForm("Create", "WorkExp", FormMethod.Post, new { onsubmit = "return SubmitForm(this)" }))
{

    @Html.AntiForgeryToken()

    @Html.HiddenFor(model => model.WorkExpId)
    <div class="form-group">
        @Html.LabelFor(model => model.From, new { @class = "control-label" })
        @Html.EditorFor(model => model.From, new { htmlAttributes = new { @class = "form-control datetimepicker1" , @readonly = "readonly" } })
        @Html.ValidationMessageFor(model => model.From, "Υποχρεωτικό πεδίο",
            new { @class = "text-danger" })
    </div>
    <div class="form-group">
        @Html.LabelFor(model => model.To, new { @class = "control-label" })
        @Html.EditorFor(model => model.To, new { htmlAttributes = new { @class = "form-control datetimepicker2", @readonly = "readonly" } })
        @Html.ValidationMessageFor(model => model.To, "Υποχρεωτικό πεδίο",
            new { @class = "text-danger" })
    </div>
    <div class="form-group">
        @Html.LabelFor(model => model.Employer, new { @class = "control-label" })
        @Html.EditorFor(model => model.Employer, new { htmlAttributes = new { @class = "form-control" } })
        @Html.ValidationMessageFor(model => model.Employer, "Υποχρεωτικό πεδίο",
            new { @class = "text-danger" })
    </div>
    <div class="form-group">
        @Html.LabelFor(model => model.Position, new { @class = "control-label" })
        @Html.EditorFor(model => model.Position, new { htmlAttributes = new { @class = "form-control" } })
        @Html.ValidationMessageFor(model => model.Position, "Υποχρεωτικό πεδίο",
            new { @class = "text-danger" })
    </div>
    <div class="form-group">
        @Html.LabelFor(model => model.Description, new { @class = "control-label" })
        @Html.EditorFor(model => model.Description, new { htmlAttributes = new { @class = "form-control", @maxlength = "250" } })
        <div id="textarea_feedback2" style="float: right;"></div>
    </div>
    <div class="form-group">
        <input type="submit" value="Αποθήκευση" class="btn btn-success" />
        <input type="reset" value="Επαναφορά" class="btn" />
    </div>


}

Датируемая инициация

 <script>

$(document).ready(function () {

            $.fn.dataTable.moment('DD/MM/YYYY');
            dataTable1 = $('#employmenthistory').DataTable({


                "ajax": {
                    "url": "/WorkExp/GetData",
                    "type": "GET",
                    "datatype": "json"


                },
                "language": {
                    "emptyTable": "Καμία καταχώρηση. Πατήστε στο κουμπί 'Προσθήκη' για να ξεκινησέτε"
                },
                "pageLength": 50,
                "responsive": true,
                "aaSorting": [],
                "columns": [
                    {
                        "data": "From", render: function (d) {
                            return moment(d).format("DD/MM/YYYY");
                        } },
                    {
                        "data": "To", render: function (d) {
                            return moment(d).format("DD/MM/YYYY");
                        } },
                    { "data": "Employer" },
                    { "data": "Position" },
                    { "data": "Description" },
                    {
                        "data": "WorkExpId", "render": function (data) {

                            return "<a class='btn btn-light btn-sm' onclick=PopupForm('@Url.Action("Create","WorkExp")/" + data + "')><i class='fa fa-edit'></i> Επεξεργασία</a><a class='btn btn-danger btn-sm' style='margin-left:5px;color:white;' onclick= Delete(" + data + ")><i class= 'fa fa-trash'></i> Διαγραφή</a>";
                        },
                        "className": "text-center",
                        "orderable": false,
                        "searchable": false

                    }]
            });   


 </script>

1 Ответ

0 голосов
/ 28 мая 2018

Платформа сущностей дает Id только при вызове db.SaveChanges ().Это означает, что вам нужно сначала сохранить кандидата, затем установить новый идентификатор в рабочем опыте, а затем добавить и сохранить его.

if (ModelState.IsValid)
            {
                db.Applicants.Add(applicant); 
                db.SaveChanges();//add this
                workexp.WorkExpId = applicant.FormId;
                db.WorkExps.Add(workexp);
                db.SaveChanges();
                return Json(new { success = true, message = "Αποθηκεύτηκε με επιτυχία" }, JsonRequestBehavior.AllowGet);
            }
...