Могу ли я пропустить атрибут / поле для проверки с помощью ModelState.IsValid () в asp mvc 5 (C #)? или присвоить значение скрытому полю? - PullRequest
0 голосов
/ 11 июля 2019

Я создаю веб-приложение на основе ASP.Net MVC 5 (C #) и застрял на проверке определенного типа. По сути, у меня есть 5 моделей, чьи объекты я включил в модель представления. Одна из этих пяти моделей включена в список в виде модели. Поскольку эти модели имеют отношение между ними, внешние ключи реализованы, и я аннотировал внешние ключи как Обязательные, потому что они должны быть там.

Сценарий Модельные классы: Клиент - клиенты в приложении AddressOf - адрес объектов недвижимости и клиентов ClientPhone - Телефоны Клиентов - имеет внешний ключ Клиента ClientEmail - электронные письма Клиентов - имеет внешний ключ Клиента Консультант - Консультанты по работе с клиентами в системе управления

Теперь у меня есть поля в View.cshtml для объекта клиента, объекта адреса, ClientPhone, ClientEmail и выпадающего списка для консультанта. Исключая поле для ClientPhone.ClientCNIC и ClientEmail.ClientCNIC, которые являются внешними ключами и будут введены в контроллер, когда я введу данные в таблицу клиентов. ClientCNIC имеет поле в View.cshtml, но оно происходит из таблицы клиента. Поскольку поле ClientCNIC (внешний ключ) в ClientPhone и ClientEmail имеет аннотацию [Обязательно], в ней отображается ошибка проверки.

То, что я хочу - это присвоить значение поля, созданного для Client.ClientCNIC, атрибутам ClientPhone.ClientCNIC и ClientEmail.ClientCNIC.

Заранее спасибо!

Контроллер

[HttpPost]
        public ActionResult Save(ClientFormViewModel clientFormViewModel)
        {
            if (ModelState.IsValid)
            {
                ViewBag.error = "";

                var Client = clientFormViewModel.Client;
                var Email = clientFormViewModel.ClientEmail;
                var Address = clientFormViewModel.AddressOf;
                var phone = clientFormViewModel.ClientPhone;

                _context.addressof.Add(Address);
                _context.SaveChanges();
                Client.addressofId = _context.addressof.Select(e => e.addressofId).Max();
                _context.Clients.Add(Client);
                try
                {
                    _context.SaveChanges();
                }
                catch (DbUpdateException)
                {
                    _context.addressof.Remove(Client.AddressOf);
                    _context.SaveChanges();
                    ViewBag.Duplicate = "Duplicate Client";
                    clientFormViewModel.Consultants = _context.Consultants.ToList();
                    return View("ClientForm", clientFormViewModel);
                }

                phone.ClientCNIC = Client.ClientCNIC;
                phone.PrimaryPhone = true;
                _context.ClientPhone.Add(phone);

                Email.ClientCNIC = Client.ClientCNIC;
                Email.PrimaryEmail = true;
                _context.clientemail.Add(Email);

                _context.SaveChanges();

                return Content("Successful!");
            }

            ViewBag.error = "Has Error";
            clientFormViewModel.Consultants = _context.Consultants.ToList();
            return View("ClientForm", clientFormViewModel);
        }


        public ActionResult New()
        {
            ViewBag.Type = "New Client";

            var address = new AddressOf();
            var client = new Client();
            var phone = new ClientPhone();
            var email = new ClientEmail();


            var viewModel = new ClientFormViewModel()
            {
                Client = client,
                ClientPhone = phone,
                ClientEmail = email,
                AddressOf = address,
                Consultants = _context.Consultants.ToList()
            };

            viewModel.ClientEmail.ClientCNIC = viewModel.Client.ClientCNIC;
            viewModel.ClientPhone.ClientCNIC = viewModel.Client.ClientCNIC;


            return View("ClientForm", viewModel);
        }

ClientPhone - Класс модели - Та же структура, что и у ClientEmail

namespace ITCMS4
{
    using System;
    using System.Collections.Generic;

    [Table("ClientPhones")]
    public partial class ClientPhone
    {
        [Key] public int ClientPhoneId { get; set; }
        [Required] public string Phone { get; set; }
        [Required] public bool PrimaryPhone { get; set; }
        [Display(Name = "Client"), ForeignKey("Client")] public string ClientCNIC { get; set; }
        public virtual Client Client { get; set; }
    }
}

1 Ответ

1 голос
/ 11 июля 2019

Одним из способов может быть удаление атрибута [Required] из «оскорбительных» свойств, при этом убедитесь, что им назначены правильные значения, где это необходимо. ViewModel не всегда должен применять или имитировать все правила модели данных с помощью атрибутов аннотаций данных, и это хороший пример этого.

Другим способом было бы сохранить атрибуты и создать настраиваемый ModelBinder для класса ClientFormViewModel, который вы затем применяете, применяя это «присвойте также этому» вашему правилу.

...