ASP NET – BindAttribute – Relacionando Modelos – MVC – MSSQL – C#

Publicado: 20 de setembro de 2015 em C#

Quando utilizamos um mapeamento objeto relacional para usar duas tabelas do banco de dados que estão ligadas entre si através de um identificador comum nos deparamos com algumas diferenças de conceitos do tradicional método de usar o banco de dados relacional no qual estamos acostumados. O que podemos fazer simplesmente com a linguagem SQL como declarar uma instrução Join se torna um pouco mais complicado no mundo ORM, está diferença é chamada de impedância objeto-relacional.

Existem vários métodos para que se possa lidar com esta diferença de conceitos no qual os bancos de dados ainda não estão preparados para lidar, pois os maiores banco de dados do mercado ainda são os relacionais. Podemos utilizar um método chamado Bind que apesar de simples não é muito usual devido a sua sintaxe ser um pouco diferente do padrão do qual estamos acostumado no C#.

No seu uso mais simples, o Bind nos permite utilizar entre outros um prefixo para trazer o identificador do modelo de uma visão para que possamos utiliza-lo em outra visão para filtra dados.

BindAttribute:
https://msdn.microsoft.com/en-us/library/system.web.mvc.bindattribute(v=vs.118).aspx

Deste modo podemos facilmente escrever aplicações que usam dados relacionais e manipula-los através do framework MVC. Você pode manualmente criar modelos e identificadores entre eles e liga-los utilizando bind, apesar de não muito usual está estratégia permite mais controle sobre o SQL que seu framework ORM irá utilizar para manipulação do seu banco de dados.

Relacionado dados entre modelos

1 – Crie uma aplicação C# – MVC Razor, utilize o exemplo anterior para criar os modelos, visões e Scaffold para que você obtenha um CRUD totalmente funcional sem que tenha que escrever linhas de código.

CRUD ASP.NET MVC – Entity Framework

2 – Altere a visão de apresentação chama Index do controlador de cadastro e substitua o link detalhes pelo link horários e alimente os dados que desejar.

Cadastro - Cursos

Cadastro – Cursos

3 – Crie um novo Scaffold para o modelo grade e alimente os dados utilizando os identificadores do cadastro anterior, visto que neste momento você ainda não pode vê-los, pois não são exibidos na View. Os identificadores são sequenciais, você pode utilizar a instrução Select no SQL Studio para visualiza-los ou pode exibi-los na sua View de cadastro adicionando mais um campo para ser exibido se desejar.

Horários - Grade

Horários – Grade

4 – Altere o controlador da grade de horários como no código abaixo:

Grade - Bind

Grade – Bind

Exemplo:

Neste exemplo criamos dois modelos e utilizamos um Scaffold de escrita e leitura para criar toda funcionalidade para nossa aplicação. Relacionamos os modelos manualmente através do atributo Bind.

Nesta aplicação o item JAVA EE possui o identificador 6, no qual somente o item relacionado será mostrado caso tenha um horário na tabela grade no banco de dados.

C#
Cadastro
Index.cshtml

@model IEnumerable<WebApplication1.Models.CursosModelo>

@{
    ViewBag.Title = "Index";
}


<h2>Index</h2>




    @Html.ActionLink("Create New", "Create")



<table class="table">

<tr>

<th>
            @Html.DisplayNameFor(model => model.Curso)
        </th>


<th>
            @Html.DisplayNameFor(model => model.Linguagem)
        </th>


<th>
            @Html.DisplayNameFor(model => model.Descr)
        </th>


<th></th>

    </tr>


@foreach (var item in Model) {

<tr>

<td>
            @Html.DisplayFor(modelItem => item.Curso)
        </td>


<td>
            @Html.DisplayFor(modelItem => item.Linguagem)
        </td>


<td>
            @Html.DisplayFor(modelItem => item.Descr)
        </td>


<td>
            @Html.ActionLink("Edit", "Edit", new { id=item.Id }) |

            
            @*Altere os detalhes para que você chamar a visão de horarios*@ 
            @Html.ActionLink("Horarios", "Index", "GradeModeloes", new { id=item.Id }, null) |
            @Html.ActionLink("Delete", "Delete", new { id=item.Id })
        </td>

    </tr>

}

</table>


Controlador
GradeModeloesController

using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Entity;
using System.Linq;
using System.Net;
using System.Web;
using System.Web.Mvc;
using WebApplication1.Models;

namespace WebApplication1.Controllers
{
    public class GradeModeloesController : Controller
    {
        private MinhaAppMeuDB db = new MinhaAppMeuDB();

        

        // GET: GradeModeloes
        // Use o Bind para relacionar os dados exibidos entre as visões
        public ActionResult Index([Bind (Prefix ="id")]int CursosId)
        {
            var MeuCurso = from m in db.Grades
                           where m.IdCursoModelo.Equals(CursosId)
                           select m;
            
            if (MeuCurso != null)
            {
                return View(MeuCurso);
            }

            return HttpNotFound();
        }

        // GET: GradeModeloes/Details/5
        public ActionResult Details(int? id)
        {
            if (id == null)
            {
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }
            GradeModelo gradeModelo = db.Grades.Find(id);
            if (gradeModelo == null)
            {
                return HttpNotFound();
            }
            return View(gradeModelo);
        }

        // GET: GradeModeloes/Create
        public ActionResult Create()
        {
            return View();
        }

        // POST: GradeModeloes/Create
        // To protect from overposting attacks, please enable the specific properties you want to bind to, for 
        // more details see http://go.microsoft.com/fwlink/?LinkId=317598.
        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Create([Bind(Include = "Id,Dia,hora,IdCursoModelo")] GradeModelo gradeModelo)
        {
            if (ModelState.IsValid)
            {
                db.Grades.Add(gradeModelo);
                db.SaveChanges();
                return RedirectToAction("Index");
            }

            return View(gradeModelo);
        }

        // GET: GradeModeloes/Edit/5
        public ActionResult Edit(int? id)
        {
            if (id == null)
            {
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }
            GradeModelo gradeModelo = db.Grades.Find(id);
            if (gradeModelo == null)
            {
                return HttpNotFound();
            }
            return View(gradeModelo);
        }

        // POST: GradeModeloes/Edit/5
        // To protect from overposting attacks, please enable the specific properties you want to bind to, for 
        // more details see http://go.microsoft.com/fwlink/?LinkId=317598.
        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Edit([Bind(Include = "Id,Dia,hora,IdCursoModelo")] GradeModelo gradeModelo)
        {
            if (ModelState.IsValid)
            {
                db.Entry(gradeModelo).State = EntityState.Modified;
                db.SaveChanges();
                return RedirectToAction("Index");
            }
            return View(gradeModelo);
        }

        // GET: GradeModeloes/Delete/5
        public ActionResult Delete(int? id)
        {
            if (id == null)
            {
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }
            GradeModelo gradeModelo = db.Grades.Find(id);
            if (gradeModelo == null)
            {
                return HttpNotFound();
            }
            return View(gradeModelo);
        }

        // POST: GradeModeloes/Delete/5
        [HttpPost, ActionName("Delete")]
        [ValidateAntiForgeryToken]
        public ActionResult DeleteConfirmed(int id)
        {
            GradeModelo gradeModelo = db.Grades.Find(id);
            db.Grades.Remove(gradeModelo);
            db.SaveChanges();
            return RedirectToAction("Index");
        }

        protected override void Dispose(bool disposing)
        {
            if (disposing)
            {
                db.Dispose();
            }
            base.Dispose(disposing);
        }
    }
}

 

 

Deixe um comentário