Как бы я вернул ViewModel из формы в представлении в контроллер - PullRequest
0 голосов
/ 17 января 2019

моя модель выглядит так:

Bank           Other          LawFirm 
 |              |                |   
BankContact   OtherContact    LawFirmContact
 |______________|________________|
                |
                |
              Contact 

Итак, при создании контакта я пытаюсь передать информацию для создания записи для конкретной связанной сущности. В настоящий момент я прохожу через RelationId и ContactId, а затем пытаюсь создать новую сущность в контроллере, но моя кнопка «Сохранить» в форме не срабатывает. Я думаю, это может быть потому, что я не связываю информацию должным образом. Я также публикую это, чтобы увидеть, является ли это правильным способом справиться с такой ситуацией

[HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Save(ContactFormViewModel viewModel)
    {
        if (!ModelState.IsValid)
        {
            return View("ContactForm", viewModel);
        }
        if (viewModel.Contact.Id == 0)
        {
            _context.Contacts.Add(viewModel.Contact);
            if (viewModel.IsBank)
            {
                var bankContact = new BankContact()
                {
                    BankId = viewModel.RelationId,
                    Bank = _context.Banks.Single(b => b.Id == viewModel.RelationId),
                    ContactId = viewModel.ContactId,
                    Contact = viewModel.Contact
                };
                _context.BankContacts.Add(bankContact);
            }
            else if (viewModel.IsLawFirm)
            {
                var lawFirmContact = new LawFirmContact()
                {
                    LawFirmId = viewModel.RelationId,
                    LawFirm = _context.LawFirms.Single(l => l.Id == viewModel.RelationId),
                    ContactId = viewModel.ContactId,
                    Contact = viewModel.Contact,

                };
                _context.LawFirmContacts.Add(lawFirmContact);
            }
            else if (viewModel.IsOther)
            {
                var standaloneContact = new StandaloneContact()
                {
                    StandAloneId = viewModel.RelationId,
                    Standalone = _context.Standalones.Single(s => s.Id == viewModel.RelationId),
                    Contact = viewModel.Contact,
                    ContactId = viewModel.ContactId
                };
                _context.StandaloneContacts.Add(standaloneContact);
            }
        }

        else
        {
            var contactInDb = _context.Contacts.Single(c => c.Id == viewModel.Contact.Id);

            contactInDb.Firstname = viewModel.Contact.Firstname;
            contactInDb.Surname = viewModel.Contact.Surname;
            contactInDb.Email = viewModel.Contact.Email;
            contactInDb.ContactNo = viewModel.Contact.ContactNo;

            if (!String.IsNullOrWhiteSpace(viewModel.Contact.AltContactNo))
                contactInDb.AltContactNo = viewModel.Contact.AltContactNo;            
        }

        _context.SaveChanges();
        return RedirectToAction("Index", "Contacts");

    }

<div class="card">
    <div class="card-body">
        @using (Html.BeginForm("Save", "Contacts"))
        {

        <div class="form-row">
            <div class="col-3">
                <div class="form-group">
                    @Html.LabelFor(c => c.Contact.Firstname, new { @class = "form-control-label" })
                    @Html.TextBoxFor(c => c.Contact.Firstname, new { @class = "form-control" })
                    @Html.ValidationMessageFor(c => c.Contact.Firstname)
                </div>
            </div>

            <div class="col-3">
                <div class="form-group">
                    @Html.LabelFor(c => c.Contact.Surname, new { @class = "form-control-label" })
                    @Html.TextBoxFor(c => c.Contact.Surname, new { @class = "form-control" })
                    @Html.ValidationMessageFor(c => c.Contact.Surname)
                </div>
            </div>
        </div>

            <div class="form-row">

            <div class="col-3">
                <div class="form-group">
                    @Html.LabelFor(c => c.Contact.Email, new { @class = "form-control-label" })
                    @Html.TextBoxFor(c => c.Contact.Email, new { @class = "form-control" })
                    @Html.ValidationMessageFor(c => c.Contact.Email)
                </div>
            </div>
            <div class="col-3">
                <div class="form-group">
                    @Html.LabelFor(c => c.Contact.Birthday, new { @class = "form-control-label" })
                    @Html.TextBoxFor(c => c.Contact.Birthday, new { @class = "form-control datepicker-here", @data_language = "en", @autocomplete = "off" })
                </div>
            </div>
        </div>
            <div class="form-row">
                <div class="col-3">
                    <div class="form-group">
                        @Html.LabelFor(c => c.Contact.ContactNo, new { @class = "form-control-label" })
                        @Html.TextBoxFor(c => c.Contact.ContactNo, new { @class = "form-control" })
                        @Html.ValidationMessageFor(c => c.Contact.ContactNo)
                    </div>
                </div>

                <div class="col-3">
                <div class="form-group">
                    @Html.LabelFor(c => c.Contact.AltContactNo, new { @class = "form-control-label" })
                    @Html.TextBoxFor(c => c.Contact.AltContactNo, new { @class = "form-control" })
                </div>
                    </div>

            </div>

            <div class="form-row">
                <div class="col-4">
                    <div class="form-group">
                        <input type="radio" name="choice-contact-type" id="choice-contact-type-bank" required>
                        <label for="choice-contact-type-bank">Bank</label>

                        <div class="reveal-if-active">

                            @Html.DropDownListFor(b => b.BankContact.BankId, new SelectList(Model.Banks, "Id", "Name "), "", new { @class = "form-control" })
                            @{Model.IsBank = true;}
                        </div>
                    </div>
                </div>

                <div class="col-4">
                    <div class="form-group">
                        <input type="radio" name="choice-contact-type" id="choice-contact-type-lawFirm">
                        <label for="choice-contact-type-lawFirm">Law Firm</label>

                        <div class="reveal-if-active">

                            @Html.DropDownListFor(l => l.LawFirmContact.Id, new SelectList(Model.LawFirms, "Id", "Name"), "", new { @class = "form-control" })
                            @{Model.IsLawFirm = true;}
                        </div>
                    </div>
                </div>

                <div class="col-4">
                    <div class="form-group">
                        <input type="radio" name="choice-contact-type" id="choice-contact-type-standalone">
                        <label for="choice-contact-type-standalone">Other</label>

                        <div class="reveal-if-active">

                            @Html.DropDownListFor(s => s.StandaloneContact.Id, new SelectList(Model.Standalones, "Id", "Name"), "", new { @class = "form-control" })
                            @{Model.IsOther = true;}
                        </div>
                    </div>
                </div>
            </div>

            @Html.AntiForgeryToken()
            <button type="submit" class="btn btn-primary">Save</button>

        }
    </div>
</div>

Редактировать

Скрытые раскрывающиеся поля обязательны для заполнения, и поэтому проверка не позволяет их пройти, а поскольку они были скрыты, я не мог этого увидеть! Поле обязательно для заполнения, потому что под моим StandaloneContact Id обязательно. Это всегда требуется, так как бы мне обойти это? установить значение по умолчанию?

Я все еще хотел бы знать, является ли это наилучшим способом связать модель с 3 различными моделями с отношением «многие ко многим». Есть ли другой способ сделать это в MVC?

1 Ответ

0 голосов
/ 17 января 2019

Попробуйте добавить это в форму

@using (Html.BeginForm("Save", "Contacts", FormMethod.Post))

Также в отношении правильного способа отправки данных из представления в контроллер, это в основном именно то, что вам нужно в данный момент времени. Если вы просто хотите отправить данные в форме, это, вероятно, лучший способ. Однако, если вам, например, зачем отправлять эти данные, а затем обновлять определенный аспект страницы, например частичное представление, я бы предложил использовать ajax.

РЕДАКТИРОВАТЬ: на основе редактирования вопроса, делая автономный идентификатор контакта обнуляемым, это должно решить проблему ID всегда требуется

...