none
Fazer um foreach dentro de cshtml RRS feed

  • Pergunta

  • Está dando erro da forma que eu fiz o foreach. Se coloco @ dá erro no analisador. Se retiro dá outros erros. Como eu faço? Abaixo me código completo. Do jeito que tá tá dando erro de NullException no foreach.

    @model Ruptura.Models.RupturaEntities

    @{
        ViewBag.Title = "CadastroCargo";
        Layout = "~/Views/Shared/_LayoutBase.cshtml";
    }

    <link href="~/Content/Jqwidgets/jqx.base.css" rel="stylesheet" />
    <link href="~/Content/Jqwidgets/jqx.summer.css" rel="stylesheet" />

    <br />

    <h3>Cadastro de Cargos</h3>

    <br />

    <div class="container">
        <div class="row">
            <div class="col-md-12">
                @*<div class="col-md-1">
                        <label for="txtCargo">Cargo:</label>
                    </div>*@
                <div class="col-md-4">
                    <input type="text" class="form-control col-md-6" name="txtCargo" id="txtCargo" placeholder="Digite um cargo válido">
                </div>
            </div>

            <br /><br />

            <div class="col-md-6">
                <h3 class="text-center">Unidade de negócio</h3>';
                <div class="well" style="max-height: 350px;">
                    <ul class="list-group checked-list-box" id="check-list-box">

                            @foreach (var rpt in Model.Apresentacao)
                            {
                                <li class="list-group-item" data-style="button" data-color="success">rpt.Unidade_Negocio</li>
                            }
                        
                    </ul>
                </div>
            </div>

            <div class="col-md-6">
                <br /><br /><br />
                <div class="well" style="max-height: 300px;">
                    <ul class="list-group list-box">
                        <li class="list-group-item" data-style="button">Gerente Região Norte</li>
                        <li class="list-group-item" data-style="button" data-color="success">Gerente Região Sul</li>
                        <li class="list-group-item" data-style="button" data-color="info">Gerente São Paulo</li>
                    </ul>
                </div>
            </div>

            <div class="col-md-12">
                <div class="col-md-6">
                    <label class="checkbox" for="ckbAtivo">
                        <input type="checkbox" checked="checked" class="checkbox large" data-label="suffix" data-label-prepend="prefix" name="ckbAtivo" id="ckbAtivo">Ativo
                    </label>
                </div>
            </div>

        </div>

                <div id="content">
                    <div class="listTree"></div>
                    <button class="btn btn-success" onclick=" return GravaCargo();">Gravar</button>
                    @Html.ActionLink("Voltar", "Index", "Home", new { }, new { @class = "btn btn-danger" })
                </div>
            </div>

            <script src="~/Scripts/CheckListBox/CheckListBox.js"></script>
            <script src="~/Scripts/CadastroCargo/CadastroCargo.js"></script>

    terça-feira, 26 de agosto de 2014 17:45

Todas as Respostas

  • Tente assim:

    @{
        foreach ...
    
    }

    Provavelmente ele irá grifar o <li> de verde dizendo que precisa estar dentro da div.
    terça-feira, 26 de agosto de 2014 17:46
  • Dá esse erro:

    An exception of type 'System.NullReferenceException' occurred in App_Web_a0cxhi0k.dll but was not handled in user code

    Additional information: Referência de objeto não definida para uma instância de um objeto.

    terça-feira, 26 de agosto de 2014 17:58
  • Dá esse erro:

    An exception of type 'System.NullReferenceException' occurred in App_Web_a0cxhi0k.dll but was not handled in user code

    Additional information: Referência de objeto não definida para uma instância de um objeto.

    Esse cara aqui tá preenchido certinho:  Model.Apresentacao ???
    terça-feira, 26 de agosto de 2014 18:13
  • Apresentação é uma tabela do meu BD. Ela tem informação. Testei com todas as outras tabelas e o erro continua. Acho que tem a ver com meu include, acho apenas. Agora como eu resolvo isso?
    terça-feira, 26 de agosto de 2014 18:18
  • Eu já fiz o foreach mas no ViewData. 

    Olha o link que eu achei eu acho que irá te ajudar cara:

     http://stackoverflow.com/questions/15973434/foreach-in-a-foreach-in-mvc-view

    terça-feira, 26 de agosto de 2014 18:26
  •       Tem que colocar @ na frente do rpt.Unidade_Negocio e a Model.Apresentacao sempre tem que ter valor, não pode ser NULL

    if(Model != null && Model.Apresentacao != null)

    {

      @foreach (var rpt in Model.Apresentacao)
                            {
                                <li class="list-group-item" data-style="button" data-color="success">@rpt.Unidade_Negocio</li>
                            }

    }

    terça-feira, 26 de agosto de 2014 19:59
  • Então eu pergunto, o que levaria a Model ou a Model.Apresentacao estarem nulos? O que pode acontecer? Como disse, é uma entidade do BD que está populada. Então o que poderia acontecer?

    É necessário fazer alguma instanciação?

    • Editado pnet quarta-feira, 27 de agosto de 2014 11:23
    quarta-feira, 27 de agosto de 2014 11:12
  • Então eu pergunto, o que levaria a Model ou a Model.Apresentacao estarem nulos? O que pode acontecer? Como disse, é uma entidade do BD que está populada. Então o que poderia acontecer?

    É necessário fazer alguma instanciação?

    Cara, veja o link que postei anteriormente. 

    Sempre que você retorna sua View deve trazer a model populada. 

    Caso isso não ocorra consequentemente ela estará nula. 

    Itens do link:

    public ActionResult AllCategories(int id = 0)
    {
        return View(db.Categories.Include(p => p.Products).ToList());
    }
    
    public class Product
    {
        [Key]
        public int ID { get; set; }
        public int CategoryID { get; set; }
        //new code
        public virtual Category Category { get; set; }
        public string Title { get; set; }
        public string Description { get; set; }
        public string Path { get; set; }
    
        //remove code below
        //public virtual ICollection<Category> Categories { get; set; }
    }
    
    public class Category
    {
        [Key]
        public int CategoryID { get; set; }
        public string Name { get; set; }
        //new code
        public virtual ICollection<Product> Products{ get; set; }
    }
    
    // View
    foreach (var category in Model)
    {
        <h3><u>@category.Name</u></h3>
        <div>
            <ul>    
                @foreach (var product in Model.Products)
                {
                    // cut for brevity, need to add back more code from original
                    <li>@product.Title</li>
                }
            </ul>
        </div>
    }

    quarta-feira, 27 de agosto de 2014 12:17
  • Esta é minha controller atualmente. Como eu faço? Não entendi bem.

    public class CadastroCargoController : Controller
        {
            string Erro;
            // GET: CadastroCargo
            public ActionResult Index()
            {
                return View();
            }

            public ActionResult CadastroCargo()
            {
                return View();
            }

            [HttpPost]
            public JsonResult carregaCheckBox()
            {
                RupturaEntities db = new RupturaEntities();

                var result_ap = db.Apresentacao
                                .Select (a => new {a.Codigo_Unidade_Negocio, a.Unidade_Negocio}).ToList().Distinct();

                return Json(new { result_ap }, JsonRequestBehavior.AllowGet);
            }
        }

    quarta-feira, 27 de agosto de 2014 16:59
  • Seria algo com isso:

    public class CadastroCargoController : Controller
        {
            [HttpPost]
            public JsonResult carregaCheckBox()
            {
                RupturaEntities db = new RupturaEntities();
    
                // Quis demonstrar que você deve valorizar sua model com a lista, e retornar a model
                Model.Apresentacao = db.Apresentacao
                                .Select (a => new {a.Codigo_Unidade_Negocio, a.Unidade_Negocio}).ToList().Distinct();
    
                return Json(new { Model.Apresentacao }, JsonRequestBehavior.AllowGet);
            }
        }

    Creio que possa ser isso. 

    Só não consigo testar, mas a ideia é essa.

    quarta-feira, 27 de agosto de 2014 17:17
  • Dessa forma não consigo, pois não tenho como usar o Model.Apresentacao.........
    quarta-feira, 27 de agosto de 2014 17:38
  • Dessa forma não consigo, pois não tenho como usar o Model.Apresentacao.........

    Não entendi. 

    Você não pode instanciar um objeto do tipo Model.Apresentacao valoriza-lo e retornar seu list?

    quarta-feira, 27 de agosto de 2014 17:42
  • Resolvi assim:

    <ul class="list-group checked-list-box" id="check-list-box">

                        @{
                            Ruptura.Models.RupturaEntities db = new Ruptura.Models.RupturaEntities();
                            var result_ap = db.Apresentacao
                                .Select(a => new { a.Codigo_Unidade_Negocio, a.Unidade_Negocio }).ToList().Distinct();


                            foreach (var item in result_ap)
                            { 
                                <li class="list-group-item" data-style="button" data-color="success">@item.Unidade_Negocio</li>
                            }
                        }

    quarta-feira, 27 de agosto de 2014 17:44