Doubt with foreach with group by asp.net mvc

0

I have a query with grouping.

 public List<TB_POSSIBILIDADE> ListarTodos(int id)
        {
            var strQuery = "";
            strQuery += " select ";
            strQuery += " a.IDPOSSIBILIDADE,";
            strQuery += " a.IDTITULOPOSS,";
            strQuery += " A.IDMODALIDADE,";
            strQuery += " a.TITULO,";
            strQuery += " a.DESCRICAO01,";
            strQuery += "  a.DESCRICAO02,";
            strQuery += "  a.DESCRICAO03,";
            strQuery += "  a.VALOR01,";
            strQuery += "  a.VALOR02,";
            strQuery += "  a.VALOR03,";
            strQuery += "  a.MARCA1,";
            strQuery += "  a.MARCA2,";
            strQuery += "  a.MARCA3,";
            strQuery += "  a.VALORAPOSTA1,";
            strQuery += "  a.VALORAPOSTA2,";
            strQuery += "  a.VALORAPOSTA3,";
            strQuery += "  a.VALORTOTAL1,";
            strQuery += "  a.VALORTOTALRETORNO";
            strQuery += " from TB_POSSIBILIDADE a";
            strQuery += " inner join TB_TITULO_POSSIBILIDADE b on a.IDTITULOPOSS = b.IDTITULOPOSS";
            strQuery += string.Format(" where A.IDMODALIDADE = {0}  ", id);
            strQuery += "  group by a.IDTITULOPOSS,a.IDPOSSIBILIDADE,";
            strQuery += "  b.DESCRICAO, a.TITULO,";
            strQuery += "   a.DESCRICAO01, a.DESCRICAO02,";
            strQuery += "   a.DESCRICAO03,a.VALOR01,";
            strQuery += "   a.VALOR02,a.VALOR03,";
            strQuery += "   a.MARCA1,a.MARCA2,";
            strQuery += "   a.MARCA3, a.VALORAPOSTA1,";
            strQuery += "  a.VALORAPOSTA2, a.VALORAPOSTA3,";
            strQuery += "  a.VALORTOTAL1,a.VALORTOTALRETORNO,A.IDMODALIDADE";

            using (contexto = new Contexto())
            {
                var retornoDataReader = contexto.ExecutaComandoComRetorno(strQuery);
                return TransformaReaderEmListaObjetos(retornoDataReader);
            }

        }

I have an accordion where in the body in some moments I will have more than 1 option.

I have the first option with only one line: Initial A title: winner

I have the second option where I have 1 title and 4 more content initial A title: modality 02

I want to repeat this content within the same accordion

Imadethecreationofaclass:

namespace Generico.Dominio { public class TitulosNaLista { public string Titulo { get; set; } } }

On the Controller I did:

//verifcar os titulos na lista
List<TitulosNaLista> ver = new List<TitulosNaLista>();

public bool VerificarTitulos(string Titulo)
{
    return ver.Any(ls => ls.Titulo == Titulo);
}

view:

  <div class="list-group">
                          <a href="#" class="list-group-item active">
                              Selecione uma opção:
                          </a>

                          @if (Model.Count() > 0)
                          {

                          foreach (var item in Model)
                          {


                          if(!VerificarTitulos(item.TITULO))
                          {

                          <!--inicio-->
                          <div class="panel-group" id="accordion">

                              <div class="panel panel-default">
                                  <div class="panel-heading">
                                      <h4 class="panel-title">
                                          <a data-toggle="collapse" data-parent="#accordion" href="#@Html.DisplayFor(c => item.IDPOSSIBILIDADE)">
                                              @Html.DisplayFor(c => item.TITULO)
                                          </a>
                                      </h4>
                                  </div>


                                  <!--inicio do corpo-->
                                  <div id="@Html.DisplayFor(c => item.IDPOSSIBILIDADE)" class="panel-collapse collapse">
                                      <div class="panel-body">


                                          <div class="row">


                                              <div class="col-md-3 form-group">
                                                  @Html.DisplayFor(c => item.DESCRICAO01) | R$ @Html.DisplayFor(c => item.VALOR01)
                                                  @Html.TextBoxFor(c => item.VALORAPOSTA1, new { placeholder = "valor ", @class = "form-control" })
                                              </div>


                                              <div class="col-md-3 form-group">
                                                  @Html.DisplayFor(c => item.DESCRICAO02) | R$ @Html.DisplayFor(c => item.VALOR02)
                                                  @Html.TextBoxFor(c => item.VALORAPOSTA2, new { placeholder = "valor ", @class = "form-control" })
                                              </div>


                                              <div class="col-md-3 form-group">
                                                  @Html.DisplayFor(c => item.DESCRICAO03) | R$ @Html.DisplayFor(c => item.VALOR03)
                                                  @Html.TextBoxFor(c => item.VALORAPOSTA3, new { placeholder = "valor ", @class = "form-control" })
                                              </div>


                                          </div>


                                          <div class="modal-footer">
                                              <button class="btn btn-primary" type="submit" name="opcao" value="">Gravar</button>
                                          </div>

                                      </div>
                                  </div>

                                  <!--fim do corpo -->


                              </div>
                              }


                          </div>
                          <!--fim -->
                          }

                          }

                          }

                      </div>

I have an error;

    
asked by anonymous 27.07.2016 / 22:46

5 answers

4

In its View there is no method VerificarTitulos() , so the error.

To show only one title (excluding other data, if different), you can do it in two ways.

Group By direct in the query or Group By in its View (which I consider simpler).

To make Group By in View , just do the following:

foreach (var item in Model.GroupBy(x => x.Titulo).Select(grp => grp.First()).ToList())
{
  <!--inicio-->
  <div class="panel-group" id="accordion">

      <div class="panel panel-default">
          <div class="panel-heading">
              <h4 class="panel-title">
                  <a data-toggle="collapse" data-parent="#accordion" href="#@Html.DisplayFor(c => item.IDPOSSIBILIDADE)">
                      @Html.DisplayFor(c => item.TITULO)
                  </a>
              </h4>
          </div>
          ...

This way you are grouping by title and selecting only the first value. The rest will be disregarded.

It is worth mentioning that depending on the number of records, the best option would be to do it directly in the query.

    
28.07.2016 / 02:36
3

I do not understand the question very well, but I think this should help:

 <div>
<label>Utilizadores: </label>
<% 
    string [] F = new string[6];
    F[0] = "Paulo Mendes";
    F[1] = "Pedro Litio";
    F[2] = "Maria  ";
    F[3] = "Ana";
    F[4] = "Ricardo";
    F[5] = "Beto";
    for (int a =0; a <= 5; a++)
    {
        Response.Write("<a href=\"#\">  " + F[a] + "</a>");
    }

 %>
  </div>

It will repeat the link 6 times.

    
27.07.2016 / 23:23
2

Por que ocorre esse erro:

The error occurs because the VerifyTitles method you are using in View does not exist in the context of View .

Since the VerifyTitles method has been declared on your Controller it can not be called directly as you are doing in your View form:

if(!VerificarTitulos(item.TITULO)) // Erro, pois o método não existe na View
{
    ...
}

Sugestão de uma das possíveis soluções:

An alternative would be to create a property in your Model that represents a Boolean and be used in the if () condition of your View .

Example:

Model

public class SeuModel
{
    // Propriedades que já estão no seu Model
    public string TITULO { get; set; }
    public int IDPOSSIBILIDADE { get; set; }
    ...

    // Nova propriedade no seu Model
    public bool NovaPropriedadeBoleana { get; set; }

    // Seguindo o código enviado você instancia sua lista
    // Pelo seu código não vi como, mas imagino que você preenche a lista
    // Então você poderia usar o método para ao invés de retornar um bool
    // ele configurar essa NovaPropriedadeBoleana exemplo:

    List<TitulosNaLista> ver = new List<TitulosNaLista>();

    ... // preenche a lista

    // Configura a propriedade NovaPropriedadeBoleana 
    public void VerificarTitulos()
    {
        NovaPropriedadeBoleana = ver.Any(ls => ls.Titulo == Titulo);
    }
}

View

@model SeuProjeto.Models.SeuModel

    <div class="list-group">
        ...
        @if (Model.Count() > 0)
        {
            foreach (var item in Model)
            {
               if(!item.NovaPropriedadeBooleana) // Ao invés de usar o método você usaria uma propriedade do seu Model
               {
                    ....
               } ...
            } ...
         } ...
    </div>

Another option is to do Group By as per the Randrade response, then you would not even need the method that made the error.

    
28.07.2016 / 02:17
1
 //criar uma classe
public class Titulos_ Na_lista
 {
public string Titulo { get; set; }

  }

  // aqui é a tua página

 List<Titulos_ Na_lista> Ver = new List<Titulos_ Na_lista>();

 public bool VERIFICAR_Titulos(int Titulo)
 {
     return Ver.Any(l => l.Titulo ==Titulo);
 }

 foreach (var item in Model)

{
      if (!VERIFICAR_IDs(item.TITULO))
      {
              <div class="panel-group" id="accordion">

                    <div class="panel panel-default">
                        <div class="panel-heading">
                            <h4 class="panel-title">
                                <a data-toggle="collapse" data-parent="#accordion" href="#@Html.DisplayFor(c => item.IDPOSSIBILIDADE)">
                                    @Html.DisplayFor(c => item.TITULO)
                                </a>
                            </h4>
                        </div>

                        <!--inicio do corpo-->
                        <div id="@Html.DisplayFor(c => item.IDPOSSIBILIDADE)" class="panel-collapse collapse">
                            <div class="panel-body">


                                <div class="row">


                                    <div class="col-md-3 form-group">
                                        @Html.DisplayFor(c => item.DESCRICAO01) | R$ @Html.DisplayFor(c => item.VALOR01)
                                        @Html.TextBoxFor(c => item.VALORAPOSTA1, new { placeholder = "valor ", @class = "form-control" })
                                    </div>


                                    <div class="col-md-3 form-group">
                                        @Html.DisplayFor(c => item.DESCRICAO02) | R$ @Html.DisplayFor(c => item.VALOR02)
                                        @Html.TextBoxFor(c => item.VALORAPOSTA2, new { placeholder = "valor ", @class = "form-control" })
                                    </div>


                                    <div class="col-md-3 form-group">
                                        @Html.DisplayFor(c => item.DESCRICAO03) | R$ @Html.DisplayFor(c => item.VALOR03)
                                        @Html.TextBoxFor(c => item.VALORAPOSTA3, new { placeholder = "valor ", @class = "form-control" })
                                    </div>


                                </div>


                                <div class="modal-footer">
                                    <button class="btn btn-primary" type="submit" name="opcao" value="">Gravar</button>
                                </div>

                            </div>
                        </div>

                        <!--fim do corpo -->
                    </div>

                </div>
      }
}
    
28.07.2016 / 00:24
1

Friend, you are using MVC with which database? Is it a choice not to use Entity Framework, or do not you know?

Frankly, I see several flaws in your development pattern that generate errors!

1) Concatenation of the same string several times!

Solution: The StringBuilder class is used for this, however I would not use the stringbuilder, I would use Entities Linq Framework

2)

Solution: Is not used this way by allowing SQL Injection, if you use classes with SQLParameter

3) You're imagining that a method created in the Controller is accessible in View!

Solution: It's not! in the View you can instantiate a new call from any class (by putting using the namespace at the beginning).

4) Use Entity Framework, it's easy enough ... there are many examples on the internet!

5) And finally, it would be more readable for us, to put an image with what you want (prototype) and your database!

    
29.07.2016 / 18:54