Ошибка в форме POST: сложные типы, связанные с моделью, не должны быть абстрактными или значениями и должны иметь конструктор без параметров - PullRequest
0 голосов
/ 29 апреля 2019

Я получаю сообщение об ошибке при запуске моего проекта и отправке POST через мой Register.cshtml View. Смотрите ошибку ниже:

InvalidOperationException: не удалось создать экземпляр типа 'AdoteRJ.Models.Adotante'. Сложные типы, связанные с моделью, не должны быть абстрактными или значениями и должны иметь конструктор без параметров. В качестве альтернативы, задайте для параметра 'model' ненулевое значение по умолчанию. Microsoft.AspNetCore.Mvc.ModelBinding.Binders.ComplexTypeModelBinder.CreateModel (ModelBindingContext bindingContext)

Эта ошибка стала возникать после того, как я произвел рефакторинг класса MyEntity (Adotante), добавив несколько сложных типов, чтобы сделать его богатым доменом. По какой-то причине я еще не обнаружил, эта ошибка началась, и POST получает ошибку 500, хотя данные формы успешно заполнены (я проверил это в заголовках инструментов dev)

Я использую .NET Core 2.1

Кроме того, я нашел этот вопрос ниже, с той же проблемой, но ответ не решает ее - если вы добавляете пустой конструктор, ошибка исчезает, но форма отправляется пустой ... Сложные типы, связанные с моделью, не должны быть абстрактными или значениями и должны иметь конструктор без параметров

Мой код:

public class Adotante : Entity
    {   

        public Adotante(
            Email email, 
            string senha, 
            NomeCompleto nomeCompleto, 
            string foto, 
            Lar lar            
            )
        {
            Email = email;
            Senha = senha;
            NomeCompleto = nomeCompleto;
            Foto = foto;
            Lar = lar;            
        }

       public Email Email { get; private set; }

       [DataType(DataType.Password)]
       [StringLength(100, MinimumLength = 6)]
       public string Senha { get; private set; }

       public NomeCompleto NomeCompleto { get; private set; }

       public string Foto { get; private set; }

       public Lar Lar { get; private set; }


        #region Adotante Métodos

        public void SetEmail(Email email)
        {
            email = this.Email;
        }

        #endregion
    }

Пример одного из моих классов ValueObject:

public class Email : ValueObject
    {

        public Email() { }

        public Email(string enderecoEmail)
        {
            EnderecoEmail = enderecoEmail;
        }

        [Display(Name = "E-Mail")]
        [Required(ErrorMessage = "Por favor, insira o e-mail do usuário/adotante")]
        [EmailAddress]
        public string EnderecoEmail { get; private set; }
    }
}

Форма в моем классе Register.cshtml:

<div class="row">
    <form asp-controller="Account" asp-action="Register" asp-route-returnurl="@ViewData["ReturnUrl"]" method="post" class="form-horizontal">
        <div class="col-md-1">
            <!-- Gap between columns -->
        </div>
        <div class="col-md-4">
            <div asp-validation-summary="ModelOnly" class="text-danger"></div>
            <div class="form-group">
                <label asp-for="Email" class="control-label"></label>
                <div class="input-group">
                    <span class="input-group-addon"><i class="material-icons">email</i></span>
                    <div class="form-line">
                        <input asp-for="Email.EnderecoEmail" class="form-control" />
                        <span asp-validation-for="Email" class="text-danger"></span>
                    </div>
                </div>
            </div>
            <div class="form-group">
                <label asp-for="Senha" class="control-label"></label>
                <div class="input-group">
                    <span class="input-group-addon"><i class="material-icons">lock</i></span>
                    <div class="form-line">
                        <input asp-for="Senha" class="form-control" />
                        <span asp-validation-for="Senha" class="text-danger"></span>
                    </div>
                </div>
            </div>
            <div class="form-group">
                <label asp-for="NomeCompleto" class="control-label"></label>
                <div class="input-group">
                    <span class="input-group-addon"><i class="material-icons">person</i></span>
                    <div class="form-line">
                        <input asp-for="NomeCompleto.Nome" class="form-control" />
                        <span asp-validation-for="NomeCompleto" class="text-danger"></span>
                    </div>
                </div>
            </div>
            <div class="form-group">
                <label asp-for="Foto" class="control-label"></label>
                <div class="input-group">
                    <span class="input-group-addon"><i class="material-icons">insert_photo</i></span>
                    <div class="form-line">
                        <input asp-for="Foto" class="form-control" />
                        <span asp-validation-for="Foto" class="text-danger"></span>
                    </div>
                </div>
            </div>
            <div class="form-group">
                <label asp-for="Lar.RendaMensal" class="control-label"></label>
                <div class="input-group">
                    <span class="input-group-addon"><i class="material-icons">attach_money</i></span>
                    <div class="form-line">
                        <input asp-for="Lar.RendaMensal" class="form-control date" />
                        <span asp-validation-for="Lar.RendaMensal" class="text-danger"></span>
                    </div>
                    <span class="input-group-addon">,00</span>
                </div>
            </div>
            <div class="form-group">
                <input type="submit" value="Finalizar Cadastro" class="btn btn-primary btn-lg" />
            </div>
        </div>
        <div class="col-md-1">
            <!-- Gap between columns -->
        </div>
        <div class="col-md-4">
            <div class="form-group">
                <label asp-for="Lar.PessoasNaCasa" class="control-label"></label>
                <div class="input-group">
                    <span class="input-group-addon"><i class="material-icons">home</i></span>
                    <div class="form-line">
                        <input asp-for="Lar.PessoasNaCasa" class="form-control" />
                        <span asp-validation-for="Lar.PessoasNaCasa" class="text-danger"></span>
                    </div>
                </div>
            </div>
            <div class="form-group">
                <label asp-for="Lar.MetragemCasa" class="control-label"></label>
                <div class="input-group">
                    <span class="input-group-addon"><i class="material-icons">home</i></span>
                    <div class="form-line">
                        <input asp-for="Lar.MetragemCasa" class="form-control" />
                        <span asp-validation-for="Lar.MetragemCasa" class="text-danger"></span>
                    </div>
                </div>
            </div>
            <div class="form-group">
                <label asp-for="Lar.TipoLar" class="control-label"></label>
                <div class="input-group">
                    <span class="input-group-addon"><i class="material-icons">home</i></span>
                    <div class="form-line">
                        <select asp-for="Lar.TipoLar" asp-items="Html.GetEnumSelectList<TipoLar>()">
                            <option value="" selected disabled hidden>Selecione</option>
                        </select>
                        <span asp-validation-for="Lar.TipoLar" class="text-danger"></span>
                    </div>
                </div>
            </div>
            <div class="form-group">
                <label asp-for="Lar.CasaComTela" class="control-label"></label>
                <div class="input-group">
                    <span class="input-group-addon"><i class="material-icons">home</i></span>
                    <div class="form-line">
                        <select asp-for="Lar.CasaComTela" asp-items="Html.GetEnumSelectList<CasaComTela>()">
                            <option value="" selected disabled hidden>Selecione</option>
                        </select>
                        <span asp-validation-for="Lar.CasaComTela" class="text-danger"></span>
                    </div>
                </div>
            </div>
            <div class="form-group">
                <label asp-for="Lar.TemCriancas" class="control-label"></label>
                <div class="input-group">
                    <span class="input-group-addon"><i class="material-icons">home</i></span>
                    <div class="form-line">
                        <select asp-for="Lar.TemCriancas" asp-items="Html.GetEnumSelectList<TemCriancas>()">
                            <option value="" selected disabled hidden>Selecione</option>
                        </select>
                        <span asp-validation-for="Lar.TemCriancas" class="text-danger"></span>
                    </div>
                </div>
            </div>
            <div class="form-group">
                <label asp-for="Lar.TemAnimais" class="control-label"></label>
                <div class="input-group">
                    <span class="input-group-addon"><i class="material-icons">home</i></span>
                    <div class="form-line">
                        <select asp-for="Lar.TemAnimais" asp-items="Html.GetEnumSelectList<TemAnimais>()">
                            <option value="" selected disabled hidden>Selecione</option>
                        </select>
                        <span asp-validation-for="Lar.TemAnimais" class="text-danger"></span>
                    </div>
                </div>
            </div>

        </div>
    </form>
</div>

1 Ответ

0 голосов
/ 29 апреля 2019

Использование атрибута [FromBody] для параметра модели входящего запроса в методе действия может помочь.Как то так:

[HttpPost]
public void Post([FromBody] Adotante incomingRequest)
{
    \\posting logic here
}
...