2
respostas

Alterar Dados Cadastrados

Senhores, estou com uma grande dúvida , pegar as informações de um item, ao clicar no botão alterar, levo pra página com os dados preenchidos numa box, altero e ao apertar em Salvar, os dados vão para uma controler, recebendo os parâmetros informador:

        public ActionResult SalvarEdicao(Servidor servidor)
        {
            context.Entry(servidor).State = EntityState.Modified;
            context.SaveChanges();
            return RedirectToAction("Index");
        }

Estava procurando algo na net e vi que utilizam o Bind:

        public ActionResult SalvarEdicao([Bind(Include = "" )]Servidor servidor)
        {
            context.Entry(servidor).State = EntityState.Modified;
            context.SaveChanges();
            return RedirectToAction("Index");
        }

Minhas dúvida é, para que serve o Bind e o include?

Obrigado desde já!

2 respostas

Olá Vinícius!

O atributo Bind permite que você ajuste o processo de "binding" de modelo para um certo tipo de parâmetro.

Por exemplo, imagine que sua action está esperando um parâmetro do tipo Pessoa definido assim:

public class Pessoa
{
    public Pessoa(string nome, string sobrenome, Sexo sexo)
    {
        this.Nome = nome;
        this.Sobrenome = sobrenome;

        if (sexo == Sexo.Masculino)
            this.NomeCompleto = "Sr. " + this.Nome + " " + this.Sobrenome;
        else
            this.NomeCompleto = "Sra. " + this.Nome + " " + this.Sobrenome;
    }

    public string Nome { get; set; }
    public string Sobrenome { get; set; }
    public Sexo Sexo { get; set; }
    //NomeCompleto é uma propriedade calculada
    public string NomeCompleto { get; set; }
}
`

E a Action:

public ActionResult Editar(Pessoa pessoa)
{
    ...
}

Agora considere que alguém poste nessa action o seguinte JSON:

{
    "Nome":"Joao",
    "Sobrenome":"Tavares",
    "Sexo":"Masculino",
    "NomeCompleto":"Sra. Joao Tavares"
}

Agora sua action terá uma pessoa com o NomeCompleto errado ("Sra" em vez de "Sr.").

Para evitar esse comportamento, você deve usar o atributo Bind e excluir explicitamente a propriedade NomeCompleto do processo de binding (fazendo assim uma "lista negra")

public ActionResult Editar([Bind(Exclude="NomeCompleto")] Pessoa pessoa)
{
    ...
}

Da mesma forma, você pode usar Include para ignorar todas as propriedades (colocá-las na "lista negra") e apenas permitir (colocar na "lista branca") as propriedades definidas na lista do Include:

public ActionResult Editar([Bind(Include="Nome,Sobrenome,Sexo")] Pessoa pessoa)
{
    ...
}

No exemplo acima, todas as propriedades fora da lista do Include (Nome,Sobrenome,Sexo) chegarão à action Editar com valor nulo, não importando como tenham sido enviadas pelo cliente.

Boa sorte e bons estudos!

Ficou beeeem mais claro, como estava tendo problemas no momento de realizar minha edição, como disse, fui acompanhando e vendo na internet e me deparei com o Bind, mesmo que ainda um pouco "embaçado" para ver , acredito que logo ficara mais claro, consegui entender muito mais com sua explicação do que com o que vi navegando.

Muito Obrigado.

E quanto a minha edição, aprendi a realizar o Debbug e verifiquei o que não estava vindo no meu parâmetro, consertei e agora consigo alterar meu dados e salvar !

Mais uma vez, muito obrigado !