I'm getting an error while running my project and sending a POST through my Register.cshtml View. See the error below:

InvalidOperationException: Could not create an instance of type 'AdoteRJ.Models.Adotante'. Model bound complex types must not be abstract or value types and must have a parameterless constructor. Alternatively, give the 'model' parameter a non-null default value. Microsoft.AspNetCore.Mvc.ModelBinding.Binders.ComplexTypeModelBinder.CreateModel(ModelBindingContext bindingContext)

This error started happenning after I refactored MyEntity class (Adotante), adding some complex types, in order to make it a rich domain. For some reason I have not discovered yet, this error started and the POST gets an error 500, although the Form Data is successfully filled (I checked it on dev tools' headers)

I'm using .NET Core 2.1

Also, I found this question below, with the same problem, but it's answer does not resolve it - if you add an empty constructor, the error disappears, but the form is sent empty... Model bound complex types must not be abstract or value types and must have a parameterless constructor

My code:

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
    }

An example of one of my ValueObject classes:

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; }
    }
}

The form on my Register.cshtml class:

<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

There are 1 best solutions below

0
On

Using [FromBody] attribute for the incoming request model parameter in the action method might help. Something like this:

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