How to add data using BeginCollection and PartialViews

1

I was able to do the system with data insertion with BeginCollection and PartialViews as seen in this question . By continuing the same, how would you edit the data entered in the database?

Example: I signed a collection point with two types of garbage (plastic and paper). Later, I want to include another type of trash (aluminum). How do I make the rows already filled up with the data I've previously chosen?

EDIT1: Follow print with two errors. It can not find the definition of Linetype and of LinetypeId. But they exist in the Collection.

TherestofthecodehasadaptedafewthingsandisOK.

EDIT1:Followprintwithtwoerrors.ItcannotfindthedefinitionofLinetypeandofLinetypeId.ButtheyexistinCollection.

The rest of the code has adapted a few things and is OK.

    
asked by anonymous 08.05.2017 / 17:32

1 answer

2

Starting with your edit:

// GET: PontosDeColeta/Edit/5
public ActionResult Edit(Guid? id)
{

    if (id == null)
    {
        return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
    }

    // Estou modificando esta linha
    var pontoDeColeta = db.PontoDeColeta
                          .Include(pc => pc.PontosDeColetaTiposDeLixo.Select(pctl => pctl.TipoDeLixo))
                          .FirstOrDefault(pc => pc.Id == id);

    if (pontoDeColeta == null)
    {
        return HttpNotFound();
    }

    pontoDeColeta.UsuarioResponsavel = User.Identity.GetUserId();

    // Aqui também.
    ViewBag.Lixo = db.TiposDeLixo.ToList();
    return View(pontoDeColeta);
}

No POST :

[HttpPost]
[ValidateAntiForgeryToken]
// Atenção ao Bind!
public ActionResult Edit([Bind(Include = "Id,NomePopular,Endereco,Cidade,Estado,Latitude,Longitude,InfoAdicional,Ativo,Apelido,UsuarioResponsavel,PontosDeColetaTiposDeLixo")] PontoDeColeta pontoDeColeta)
{
    if (ModelState.IsValid)
    {
        db.Entry(pontoDeColeta).State = EntityState.Modified;
        db.SaveChanges();

        // Tipos de Lixo Originais
        var tiposDeLixoOriginais = db.PontosDeColetaTiposDeLixo.AsNoTracking().Where(pctl => pctl.Id == pontoDeColeta.Id).ToList();

        // Tipos de Lixo Excluídos
        foreach (var tipoDeLixoOriginal in tiposDeLixoOriginais)
        {
            if (!pontoDeColeta.PontosDeColetaTiposDeLixo.Any(pctl => pctl.PontoDeColetaTipoDeLixoId == tipoDeLixoOriginal.PontoDeColetaTipoDeLixoId))
        {
            var tipoDeLixoExcluido = db.PontosDeColetaTiposDeLixo.Single(pctl => pctl.Id == tipoDeLixoOriginal.Id);
            db.PontosDeColetaTiposDeLixo.Remove(tipoDeLixoExcluido);
            db.SaveChanges();
        }
    }

    // Tipos de Lixo Inseridos
    foreach (var tipoDeLixo in pontoDeColeta.PontosDeColetaTiposDeLixo)
    {
        if (!tiposDeLixoOriginais.Any(pctl => pctl.Id == tipoDeLixo.Id))
        {
            // Tipo de Lixo associado não existe ainda. Inserir.
            tipoDeLixo.PontoDeColetaId = pontoDeColeta.Id;
            db.PontosDeColetaTiposDeLixo.Add(tipoDeLixo);
        }

        db.SaveChanges();
        return RedirectToAction("Index");
    }

    // Se a atualização falhar, você precisa carregar de novo os tipos de lixo.
    ViewBag.Lixo = db.TiposDeLixo.ToList();
    return View(pontoDeColeta);
}
    
08.05.2017 / 18:08