MVC - Невозможно установить поле / свойство для объекта - PullRequest
0 голосов
/ 12 июня 2019

У меня есть 2 таблицы в моей структуре сущностей:

INATIVOS (Сотрудники)
EMPRESAS (Компании)

При регистрации сотрудника я выбираю компанию в @ Html.DropDownListFor (Список).

Регистрация в порядке, компания сохранена правильно.Однако при попытке редактирования зарегистрированного сотрудника в списке компаний отображается ошибка «Невозможно установить поле / свойство для объекта».

INATIVO.cs

public partial class INATIVOS
{
        public decimal ID { get; set; }
        public string COD_EMPRESA { get; set; }
        public string CHAPA { get; set; }
        public string NOME { get; set; }
        public System.DateTime DATA_NASC { get; set; }
        public string PLANO { get; set; }
        public short LEI { get; set; }
        public short APOSENTADO { get; set; }
        public short ESTADO_VIDA { get; set; }
        public short ISENTO { get; set; }
        public Nullable<System.DateTime> INICIO_VIGENCIA { get; set; }
        public Nullable<System.DateTime> FIM_VIGENCIA { get; set; }
        public string CPF { get; set; }
        public string EMAIL { get; set; }
        public string ENDERECO { get; set; }
        public string NUMERO { get; set; }
        public string COMPLEMENTO { get; set; }
        public string BAIRRO { get; set; }
        public string CIDADE { get; set; }
        public string ESTADO { get; set; }
        public string CEP { get; set; }
        public string TELEFONE { get; set; }
        public string CELULAR { get; set; }
        public string OBSERVACAO { get; set; }

        public List<DEPENDENTES> DEPENDENTES { get; set; }
        public List<EMPRESAS> EMPRESAS { get; set; }
        public List<PLANOS_MEDICO> PLANOS_MEDICO { get; set; }
}

InativoController.cs

public ActionResult Index(int? id)
{
            INATIVOS inaModel = new INATIVOS();

            using (Entidades db = new Entidades())
            {
                if (id != null)
                {
                    inaModel = db.INATIVOS.Where(x => x.ID == id).FirstOrDefault();
                }

                inaModel.EMPRESAS = db.EMPRESAS.ToList<EMPRESAS>();
                inaModel.PLANOS_MEDICO = db.PLANOS_MEDICO.ToList<PLANOS_MEDICO>();
            }

            return View(inaModel);
}

1 Ответ

0 голосов
/ 12 июня 2019

Если это навигационные свойства:

public List<DEPENDENTES> DEPENDENTES { get; set; }
public List<EMPRESAS> EMPRESAS { get; set; }
public List<PLANOS_MEDICO> PLANOS_MEDICO { get; set; }

Тогда (1) они должны быть virtual и (2) они должны быть чем-то вроде IList или ICollection:

public virtual ICollection<DEPENDENTES> DEPENDENTES { get; set; }
public virtual ICollection<EMPRESAS> EMPRESAS { get; set; }
public virtual ICollection<PLANOS_MEDICO> PLANOS_MEDICO { get; set; }
<ч />

Хотя, кроме того, то, что вы здесь делаете, это очень странно :

inaModel.EMPRESAS = db.EMPRESAS.ToList<EMPRESAS>();
inaModel.PLANOS_MEDICO = db.PLANOS_MEDICO.ToList<PLANOS_MEDICO>();

По сути, то, что у вас есть в базе данных, для данного сотрудника (INATIVOS) существуют отношения с определенными компаниями (EMPRESAS) и определенными медицинскими планами (PLANOS_MEDICO). Но вы игнорируете все, что находится в этих данных, и заменяете их всеми компаниями и всеми медицинскими планами во всей базе данных .

Таким образом, каждый раз, когда вы используете это действие контроллера для получения существующей записи о сотруднике, создается впечатление, что у сотрудника есть каждая компания и каждый медицинский план. Хотя это не то, что в базе данных. Я сильно подозреваю, что это не то, что вы хотите.

<ч />

ОБНОВЛЕНИЕ: Судя по комментариям к этому ответу, похоже, что это не свойства навигации. Они даже не свойства модели вообще. Это просто списки данных, необходимых для представления (предположительно) <select> элементов.

Если они не являются частью модели данных, удалите их из модели. Вместо этого рассмотрите возможность использования модели представления. Например:

public class InativosViewModel
{
    public INATIVOS Inativos { get; set; }
    public List<EMPRESAS> EMPRESAS { get; set; }
    public List<PLANOS_MEDICO> PLANOS_MEDICO { get; set; }
}

Затем в контроллер возвращают экземпляр модели представления, который является составным объектом модели, и данные, необходимые для представления:

public ActionResult Index(int? id)
{
    InativosViewModel result = new InativosViewModel();

    using (Entidades db = new Entidades())
    {
        if (id != null)
        {
            result.Inativos = db.INATIVOS.Where(x => x.ID == id).FirstOrDefault();
        }

        result.EMPRESAS = db.EMPRESAS.ToList<EMPRESAS>();
        result.PLANOS_MEDICO = db.PLANOS_MEDICO.ToList<PLANOS_MEDICO>();
    }

    return View(result);
}

И, конечно, измените привязку модели в самом представлении, чтобы теперь ожидать и использовать экземпляр InativosViewModel. Получающееся в результате действие POST может все еще принять экземпляр INATIVOS, если это необходимо, или оно может также принять экземпляр InativosViewModel. Все зависит от структуры формы и того, что публикуется для этого действия.

В качестве альтернативы , если вы хотите продолжать использовать модель INATIVOS, все равно удалите эти списки из нее, но используйте что-то вроде ViewBag, чтобы отправить их в представление. Примерно так:

public ActionResult Index(int? id)
{
    INATIVOS inaModel = new INATIVOS();

    using (Entidades db = new Entidades())
    {
        if (id != null)
        {
            inaModel = db.INATIVOS.Where(x => x.ID == id).FirstOrDefault();
        }

        ViewBag.Empresas = db.EMPRESAS.ToList<EMPRESAS>();
        ViewBag.PlanosMedico = db.PLANOS_MEDICO.ToList<PLANOS_MEDICO>();
    }

    return View(inaModel);
}

Тогда, по вашему мнению, вы должны заполнить элементы <select> оттуда:

@Html.DropDownListFor(
    model => Model.COD_EMPRESA,
    new SelectList(ViewBag.Empresas, "CODIGO", "DESCRICAO"),
    htmlAttributes: new { @class = "form-control"
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...