2
respostas

Object reference not set to an instance of an object.

Eai galera, blz?

Estou com o problema de cair em uma exception da qual não consigo solucionar. O erro diz 'Object reference not set to an instance of an object.' Porém, o mesmo carrega o ComboBox no form com todos os dados certos, contudo, na hora de 'cadastar um usuário' ele retorna este erro.

System.NullReferenceException occurred
  HResult=0x80004003
  Message=Object reference not set to an instance of an object.
  Source=<Cannot evaluate the exception source>
  StackTrace:
   at ASP._Page_Views_Usuario_Form_cshtml.Execute() in F:\Users\Gustavo Toledo\Documents\Visual Studio 2017\Projects\ASP\WebApplication_ezconet\WebApplication_ezconet\Views\Usuario\Form.cshtml:line 31
   at System.Web.WebPages.WebPageBase.ExecutePageHierarchy()
   at System.Web.Mvc.WebViewPage.ExecutePageHierarchy()
   at System.Web.WebPages.StartPage.RunPage()
   at System.Web.WebPages.StartPage.ExecutePageHierarchy()
   at System.Web.WebPages.WebPageBase.ExecutePageHierarchy(WebPageContext pageContext, TextWriter writer, WebPageRenderingBase startPage)
   at System.Web.Mvc.RazorView.RenderView(ViewContext viewContext, TextWriter writer, Object instance)
   at System.Web.Mvc.BuildManagerCompiledView.Render(ViewContext viewContext, TextWriter writer)
   at System.Web.Mvc.ViewResultBase.ExecuteResult(ControllerContext context)
   at System.Web.Mvc.ControllerActionInvoker.InvokeActionResult(ControllerContext controllerContext, ActionResult actionResult)
   at System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilterRecursive(IList`1 filters, Int32 filterIndex, ResultExecutingContext preContext, ControllerContext controllerContext, ActionResult actionResult)
   at System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilterRecursive(IList`1 filters, Int32 filterIndex, ResultExecutingContext preContext, ControllerContext controllerContext, ActionResult actionResult)

Estes são os códigos relacionados:

UsuarioController

public class UsuarioController : Controller
{
        public ActionResult Form()
        {
            SexoDAO sexoDao = new SexoDAO();
            IList<Sexo> sexo = sexoDao.Lista();
            ViewBag.Sexo = sexo;
            return View(sexo);
        }

        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Adiciona(Usuario usuario)
        {
                   if (ModelState.IsValid)
                   {
                    UsuarioDAO dao = new UsuarioDAO();
                    dao.Adiciona(usuario);
                    return RedirectToAction("Index");
                   }
                   else
                   {
                       ModelState.AddModelError("Usuario.Valores", "Dados inválidos! Verifique os novamente.");
                        ViewBag.Usuario = usuario;
                       return View("Form");
                   }
        }
}

Utilizando esta model :

Usuario

public class Usuario
    {
        public int UsuarioId { get; set; }

        [StringLength(200)]
        public String Nome { get; set; }

        public DateTime DataNascimento { get; set; }

        [StringLength(100)]
        public String Email { get; set; }

        [StringLength(30)]
        public String Senha { get; set; }

        [Range(0,1, ErrorMessage = "Valor do status inválido!")]
        public int Ativo { get; set; }

        [Range(1,5, ErrorMessage ="Sexo não definido no BD!")]
        public int SexoId { get; set; }

        /*
        [ForeignKey("SexoId")]
        public virtual Sexo Sexo { get; set; }
        */

    }

Neste Form, onde o Visual Studio captura a exception (na linha do @foreach), seja utilizando uma ViewBag ou Model (como está o código):

Form (View Usuario)

@model IList<WebApplication_ezconet.Models.Sexo>

<div class="col">
  <div style="margin-left: -11%; width: 90%;">
      <label>Genero: @Html.ValidationMessage("Usuario.Genero")</label>
       <select id="html_sexo" class="form-control">
           <option id="#" name="#" class="dropdown-item text-muted" selected="selected" value="0">Selecione um</option>
           @foreach (var sexo in Model)
           {
             <option id="Usuario.SexoId" name="Usuario.SexoId" class="dropdown-item" value="@sexo.SexoId">@sexo.Descricao</option>
           }
        </select>
    </div>
</div>

Caso ajude, estou utilizando a Entity Framework para fazer o CRUD no BD, que até então está tudo ok.

Estou esquecendo algum detalhe? Algo? Help ai.

2 respostas

Não sei se te ajudam , mas este erro ocorre quando o VS não consegue receber um valor que foi esperado no código. Por exemplo, como vc informou que o erro ocorre na linha do Foreach da view, verifique se o problema não está na propriedade Sexo. Contudo, o erro que o VisualStudio, informa que é na "Usuario\Form.cshtml:line 31". Ou seja, verifique qual é a propridade da linha 31 da sua Form.cshtml. Esta é a propriedade que provavelmente est´com valor nulo ao ser repassado para a Controller.

Eai Leandro!

Obrigado pela dica, a causa ainda é desconhecida (O porque de estar nulo), porém consegui contornar este erro pegando os valores dos inputs do form lá no controller, onde pude realizar um filtro melhor dos dados que estavam sendo recebidos e agora está redondo hahahaha