Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Exibir na tela os dados vindo do Banco de Dados

Tenho vários clientes cadastrados no banco, fiz um método no ClienteDAO para consultar os clientes, depois fiz o método no ClienteController para renderizar para a view, ele para no foreach da view.

System.NullReferenceException não foi manipulada pelo código do usuário
  HResult=-2147467261
  Message=Referência de objeto não definida para uma instância de um objeto.
  Source=App_Web_2mm1skrf
  StackTrace:
       em ASP._Page_Views_cliente_Index_cshtml.Execute() na d:\OCW\SistemaOCW\SistemaOCW\Views\Cliente\Index.cshtml:linha 15
       em System.Web.WebPages.WebPageBase.ExecutePageHierarchy()
       em System.Web.Mvc.WebViewPage.ExecutePageHierarchy()
       em System.Web.WebPages.StartPage.RunPage()
       em System.Web.WebPages.StartPage.ExecutePageHierarchy()
       em System.Web.WebPages.WebPageBase.ExecutePageHierarchy(WebPageContext pageContext, TextWriter writer, WebPageRenderingBase startPage)
       em System.Web.Mvc.RazorView.RenderView(ViewContext viewContext, TextWriter writer, Object instance)
       em System.Web.Mvc.BuildManagerCompiledView.Render(ViewContext viewContext, TextWriter writer)
       em System.Web.Mvc.ViewResultBase.ExecuteResult(ControllerContext context)
       em System.Web.Mvc.ControllerActionInvoker.InvokeActionResult(ControllerContext controllerContext, ActionResult actionResult)
       em System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClass1c.<InvokeActionResultWithFilters>b__19()
       em System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilter(IResultFilter filter, ResultExecutingContext preContext, Func`1 continuation)
  InnerException:
using SistemaOCW.Entidade;
using System;
using System.Collections.Generic;
using System.EnterpriseServices;
using System.Linq;
using System.Web;
using SistemaOCW.Infra;
using NHibernate;

namespace SistemaOCW.DAO
{
    public class ClienteDAO
    {
        private ISession session;


        public ClienteDAO(ISession session)
        {
            this.session = session;
        }


        public void Adiciona(Cliente cliente)
        {
            NHibernate.ITransaction transacao = session.BeginTransaction();
            session.Save(cliente);
            transacao.Commit();
        }

        public IList<Cliente> List()  {
            NHibernate.ITransaction transacao = session.BeginTransaction();            
            IQuery query = session.CreateQuery("from Cliente");
            IList<Cliente> clientes = query.List <Cliente>();
            return clientes;
            }



        }


        // public Cliente BuscaPorId(int id)    
        //  {
        //  return session.Get<Cliente>(id);
        //  }
    }
namespace SistemaOCW.Controllers
{
    public class ClienteController : Controller
    {

        public ActionResult Form()
        {           
            {         

                return View();
            }
        }

        //
        // GET: /Cliente/

        public ActionResult Index()

        {
            ISession session = NHibernateHelper.AbreSession();
            ClienteDAO dao = new ClienteDAO(session);
            IList<Cliente> clientes = dao.List();         
            return View("index");
        }

        public ActionResult Adiciona(Cliente cliente)
        {

            ISession session = NHibernateHelper.AbreSession();            

            ClienteDAO dao = new ClienteDAO(session);            

            dao.Adiciona(cliente);
            session.Close();
            return RedirectToAction("Index");
        }
      }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace SistemaOCW.Entidade
{
    public class Cliente
    {
        public virtual int Id { get; set; }
        public virtual int Codcliente { get; set; }
        public virtual string Nome { get; set; }
        public virtual string Cnpj { get; set; }
        public virtual string Endereco { get; set; }
        public virtual string Bairro { get; set; }
        public virtual string Cidade { get; set; }
        public virtual string Cep { get; set; }
        public virtual string Telefone { get; set; }
        public virtual string Email { get; set; }
        public virtual string Contato { get; set; }
        public virtual Empresa empresa { get; set; }


    }
}
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
                   assembly="SistemaOCW"
                   namespace="SistemaOCW.Entidade">
  <class name ="Cliente">
    <id name ="Id">
      <generator class ="identity"/>
    </id>
    <property name="Codcliente"/>
    <property name="Nome"/>
    <property name="Cnpj"/>
    <property name="Endereco"/>
    <property name="Bairro"/>
    <property name="Cidade"/>
    <property name="Cep"/>
    <property name="Telefone"/>
    <property name="Email"/>
    <property name="Contato"/>
    <many-to-one name="empresa" column="EmpresaId" class = "Empresa"/>
  </class>
</hibernate-mapping>
@{ 
    ViewBag.Title = "Index";
}

<h2>Index</h2>
<table>
    <thead>
        <tr>
            <th>Id</th>
            <th>Nome do Cliente</th>

        </tr>
    </thead>
    <tbody>
        @foreach (var cliente in Model)
        {
            <tr>
                <td>@cliente.Id</td>
                <td>@cliente.Nome</td>                
            </tr>        
        }
    </tbody>
</table>
3 respostas

Alguem poderia me ajudar com esse cenario descrito acima.

solução!

Oi Leonardo

O seu problema é que o método Index do ClienteController não está enviando a lista para a camada de visualização:

public ActionResult Index()
{
    ISession session = NHibernateHelper.AbreSession();
    ClienteDAO dao = new ClienteDAO(session);
    // Essa lista não é utilizada
    IList<Cliente> clientes = dao.List();         
    return View("index");
}

Para o seu código funcionar, você precisa passar a lista como argumento do método View:

public ActionResult Index()
{
    ISession session = NHibernateHelper.AbreSession();
    ClienteDAO dao = new ClienteDAO(session);
    IList<Cliente> clientes = dao.List();    

    // Passa a lista de clientes para a view
    // na variável Model do razor
    return View("index", clientes);
}

Como o nome da view que você está tentando utilizar é igual ao nome da action, você não precisa passar o "index" como argumento do método View:

public ActionResult Index()
{
    ISession session = NHibernateHelper.AbreSession();
    ClienteDAO dao = new ClienteDAO(session);
    IList<Cliente> clientes = dao.List();    

    // O padrão já é enviar o cliente para Views/<nome do controller>/<nome do método>.cshtml
    // Nesse caso seria para: Views/Cliente/Index.cshtml
    return View(clientes);
}

Oi Leonardo

O seu problema foi resolvido?

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software