No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

No se trata de lo que quieres comprar, sino de quién quieres ser. Aprovecha el precio especial.

Antes: $249

Currency
$209

Paga en 4 cuotas sin intereses

Paga en 4 cuotas sin intereses
Suscríbete

Termina en:

14 Días
20 Hrs
49 Min
43 Seg
Curso de ASP.NET Core

Curso de ASP.NET Core

Juan Carlos Ruiz

Juan Carlos Ruiz

Tu primer Reto

28/35
Recursos

Aportes 40

Preguntas 2

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

Para facilitarme la navegación de este reto fue hace todo por medio de botones para ir a las vistas, haciendo uso del Viewbag para poder reutilizar la vista de “Multi”

public IActionResult MultiCourse()
        {
            ViewBag.Create = "/Course/Create";
            ViewBag.Update = "/Course/Update";
            ViewBag.Delete = "/Course/Delete";
            return View(_context.Courses.ToList());
        }

Luego creé los métodos de Editar curso, y al momento de guardar los cambios usé “RedirectToAction” para que la URL también cambiara

public IActionResult Update(string id)
{
    var Course = from cour in _context.Courses
                    where cour.id == id
                    select cour;
    return View(Course.SingleOrDefault());
}


[HttpPost]
public IActionResult Update(Course newData, string id)
{
    if(ModelState.IsValid){

        var CourseSearch = from cour in _context.Courses
                                where cour.id == id
                                select cour;

        var Course = CourseSearch.SingleOrDefault();
        
        Course.address = newData.address;
        Course.name = newData.name;
        Course.journey = newData.journey;
        _context.SaveChanges();

        ViewBag.Create = "/Course/Create";
        ViewBag.Update = "/Course/Update";
        ViewBag.Delete = "/Course/Delete";

        return RedirectToAction("MultiCourse");
    }

    return View(newData);
    
}	

Luego para la acción de eliminar, el botón pasa por medio la URL el id, la acción del controlador lo busca en el contexto, lo elimina y hace redirect a la vista de Multi

public IActionResult Delete(string id)
{
    var CourseSearch = from cour in _context.Courses
                            where cour.id == id
                            select cour;

    _context.Courses.Remove(CourseSearch.FirstOrDefault());

    _context.SaveChanges();

    ViewBag.Create = "/Course/Create";
    ViewBag.Update = "/Course/Update";
    ViewBag.Delete = "/Course/Delete";

    return RedirectToAction("MultiCourse");
}

Creo que lo del viewbag no es una buena práctica, pero por el momento fue lo que se me ocurrió 😄

Cumplimiento del reto.
Repositorio en GitHub.




En mi solución hice un poco de trampas 😄, pues usando Visual Studio (no Code), tramite “Scaffolding” creé automaticamente la vista. Para no perder cuanto hecho en las clases anteriores modifiqué ligeramente la vista parcial que muestra el elenco de objetos Escuela.

El resultado es este:

Mientras la vista generada automaticamente me permite agregar otras cosas:

Para el estilo de la tabla y los botones use Bootstrap.

Para ver el codigo, visitar el repositorio.

Mi solución del reto:

Vista de Update.cshtml para Curso:

@model Curso

@{
    ViewData["Title"] = "Actualización de Curso";
    Layout = "Simple";
}

<h1>@ViewData["Title"]</h1>
<h2>@ViewBag.MensajeExtra</h2>

<div asp-validation-summary="All"></div>
<form method="POST">
    <div>
        <label asp-for="Id"></label>
        <input asp-for="Id" />
    </div>
    <div>
        <label asp-for="Nombre"></label>
        <input asp-for="Nombre" />
    </div>
    <div>
        <label asp-for="Dirección"></label>
        <input asp-for="Dirección" />
    </div>
    <div>
        <label asp-for="Jornada"></label>
        @Html.DropDownList(
            "Jornada", Html.GetEnumSelectList<TiposJornada>(),
            "Seleccione una Jornada", new {@class = "form-control"}
        )
    </div>
    <input type="submit" />
</form>

<p><i>@ViewBag.Fecha</i></p>

El códico del Controller para Curso (dos métodos):

        public IActionResult Update () {
            ViewBag.Fecha = DateTime.Now;

            return View ();
        }

        [HttpPost]
        public IActionResult Update (Curso curso) {
            ViewBag.Fecha = DateTime.Now;

            if (ModelState.IsValid) {
                Curso cursoDb = _context.Cursos.Where (c => c.Id == curso.Id).SingleOrDefault ();
                if (cursoDb == null || string.IsNullOrWhiteSpace (cursoDb.Id)) {
                    ViewBag.MensajeExtra = "El curso no existe. Compruebe el ID.";

                    return View (curso);
                }
                var escuela = _context.Escuelas.FirstOrDefault ();
                if (curso.EscuelaId != cursoDb.EscuelaId) cursoDb.EscuelaId = curso.EscuelaId;
                if (curso.Nombre != cursoDb.Nombre) cursoDb.Nombre = curso.Nombre;
                if (curso.Dirección != cursoDb.Dirección) cursoDb.Dirección = curso.Dirección;
                if (curso.Jornada != cursoDb.Jornada) cursoDb.Jornada = curso.Jornada;

                _context.Cursos.Update (cursoDb);
                _context.SaveChanges ();
                ViewBag.MensajeExtra = "Curso actualizado";

                return View ("Index", curso);
            } else {
                return View (curso);
            }
        }

Saludos.

Reto: Implementar edición para los cursos.

Implementación:

En CursoController:

[Route("Curso/Update")]
        [Route("Curso/Update/{cursoId}")]
        public IActionResult Update(string cursoId)
        {
            var cursoResponse = from curso in _context.Cursos
                where curso.Id == cursoId
                select curso;

            // validation: cursoId is available
            if (string.IsNullOrWhiteSpace(cursoId)) return MultiCurso();
            
            return View(cursoResponse.SingleOrDefault());
        }


        [Route("Curso/Update/{cursoId}")]
        [HttpPost]
        public IActionResult UpdatePost(string cursoId, Curso cursoForm)
        {   
            var curso = _context.Cursos.Find(cursoId);
            
            // validating all required data
            if (!ModelState.IsValid) return View("Update", curso);

            // search and extract the course to be updated
            // from db
            var modelCurso = _context.Cursos
                .SingleOrDefault(c => c.Id == cursoId);
            
            // updating fields
            // in case curso does not exist
            if (modelCurso == null) return MultiCurso();

            modelCurso.Nombre = cursoForm.Nombre;
            modelCurso.Direccion = cursoForm.Direccion;
            modelCurso.Jornada = cursoForm.Jornada;
            
            // saving updated data
            _context.SaveChanges();
            
            ViewBag.MensajeExtra = "Curso Actualizado con éxito!";
            
            // return to individual view(Note: Not method Index,
            // Index view instead)
            // add the course searched
            return View("Index",curso);
        }

En Update.cshtml:

<!-- Validations errors that come from controller -->
        <div class="alert-warning" asp-validation-summary="All"></div>
        
        <form method="POST" asp-controller="Curso" asp-action="UpdatePost">
            <!--input type="hidden" asp-for="Id" name="Id"-->
            <div class="form-group">
                <label asp-for="Nombre">Nombre</label>
                <input type="text" class="form-control" asp-for="Nombre" required/>
            </div>
            <div class="form-group">
                <label asp-for="Direccion">Dirección</label>
                <input type="text" class="form-control" asp-for="Direccion" required/>
            </div>
            <div class="form-group">
                <label asp-for="Jornada">Jornada</label>

                @Html.DropDownList(
                    /*asp-for, enum to call*/
                    "Jornada", Html.GetEnumSelectList<TiposJornadas>(),
                    /*Text by default*/
                    "Seleccionar una jornada",
                    /*css attributes*/
                    new {@class = "form-control"}
                    )

            </div>

            <input type="submit" value="Actualizar el curso"/>
        </form>

También tuve que implementar una vista parcial llamada ListCurso y agregarla a Multicurso en lugar de ListEscuelaBase:

@model List<Curso>

<div class="">
    <table class="table table-bordered table-hover">
        <thead>
        <tr>
            <th scope="col">Nombre</th>
            <th scope="col">Id</th>
            <th scope="col">Acciones</th>
        </tr>
        </thead>
        <tbody>
        @foreach (var obj in @Model)
        {
            <tr>
                <td>@obj.Nombre</td>
                <td>@obj.Id</td>
                <td><a class="btn btn-primary" asp-route-cursoId="@obj.Id" 
                       asp-controller="Curso" asp-action="Update">Editar</a></td>
            </tr>
        }
        </tbody>
    </table>
</div>

En ello añado un botón para poder llevar el id del curso específico al controller.Update(get), depués este método devuelve un form autocompletado con el curso específico a modificar, hecho esto, se procede a clickar el boton para actualizar, entonces es llamado el método UpdatePost que recibe Id y curso, actualiza y devuelve la vista individual con el curso actualizado en caso exitoso, de otra manera te regresa al update con los datos originales y un mensaje del error en algún campo, que cometió el user.

¡Hola!
Les comparto una imagen y el link a mi solución del reto:

https://github.com/gbeto21/platzi-asp-net-core/tree/Reto

extracto de CursoController

public IActionResult Update()
        {
            ViewBag.Fecha = DateTime.Now;

            Curso curso = _context.Cursos.FirstOrDefault();

            return View(curso);
        }

        [HttpPost]
        public IActionResult Update(Curso curso)
        {
            ViewBag.Fecha = DateTime.Now;

            if(ModelState.IsValid)
            {
                Curso cursoDb = _context.Cursos.Where( c => c.Id == curso.Id).Single();

                if(cursoDb != null)
                {
                    cursoDb.EscuelaId = curso.EscuelaId;
                    cursoDb.Nombre = curso.Nombre;
                    cursoDb.Dirección = curso.Dirección;
                    cursoDb.Jornada = curso.Jornada;

                    _context.Cursos.Update(cursoDb);
                    _context.SaveChanges();

                    ViewBag.MensajeExtra = "Curso Actualizado";
                    return View("Index", curso);
                }
                ViewBag.MensajeExtra = "No se encontró el Curso";
            }
            return View(curso);
        }

extracto de Update.cshtml

<form method="POST">
    <div>
        <label asp-for="Nombre"></label>
        <input asp-for="Nombre"/>
    </div>
    <div>
        <label asp-for="Dirección"></label>
        <input asp-for="Dirección"/>
    </div>
    <div>
        <label asp-for="Jornada"></label>
        @Html.DropDownList(
            "Jornada", Html.GetEnumSelectList<TiposJornada>(),
            "Seleccione una jornada",
            new {@class = "form-control"}
        )
    </div>
    <div>
        <input type="hidden" asp-for="Id"/>
    </div>
    <input type="submit" />
</form>

Dejo solo como hice la actualización ya que “Asignatura” y “Alumno” para crear y actualizar no debería de haber diferencia con respecto a “Curso”.

  1. Agregue la view “Update.cshtml” (copiandola de “Create.cshtml”, cambiando titulos).
  2. Al controller agregue dos cosas.
[Route("Curso/Update/{cursoId}")]
public IActionResult Update(string cursoId)
{
    if (string.IsNullOrWhiteSpace(cursoId)) {
        return View("MultipleCurso", _context.Cursos);
    }
    // Para el select por Id de escuelas
    ViewBag.escuelas = _context.Escuelas.ToArray();

    var curso = from cur in _context.Cursos
                            where cur.Id == cursoId
                            select cur;

    return View(curso.SingleOrDefault());
}

[HttpPost]
[Route("Curso/Update/{cursoId}")]
public IActionResult Update(Curso curso, string cursoId)
{
    if (ModelState.IsValid)
    {
        var cursoBD = (from cur in _context.Cursos
                                where cur.Id == cursoId
                                select cur).FirstOrDefault();

        cursoBD.Nombre = curso.Nombre;
        cursoBD.Direccion = curso.Direccion;
        cursoBD.EscuelaId = curso.EscuelaId;
        cursoBD.Jornada = curso.Jornada;

        _context.SaveChanges();

        ViewBag.mensaje = "Curso actualizado con éxito";

        return View("Index", curso);
    }
    else
    {
        return View(curso);
    }
}

Solución del reto

En el Controlador de cursos

public IActionResult Edit(string id)   
        {
            if(!string.IsNullOrWhiteSpace(id)){

                var curso = _context.Cursos.Find(id);

                return View(curso);
            }else{
                return View("MultiCurso", _context.Cursos);
            }
        }

        [HttpPost]
        public IActionResult Edit(Curso curso)   
        {       
            if(ModelState.IsValid){
                var escuela = _context.Escuelas.FirstOrDefault();    
                curso.EscuelaId=escuela.Id;
                _context.Cursos.Update(curso);
                _context.SaveChanges();
            }
            return View();
        }

Crear vista parcial Details.cshtml para usarla tanto en Create.cshtml como en Edit.cshtml

@model Curso

<div class="form-group">
    <label asp-for="Nombre"></label>
    <input asp-for="Nombre" id="Nombre" class="form-control" type="text" />
</div>

<div class="form-group">
    <label asp-for="Dirección">Dirección</label>
    <input asp-for="Dirección" id="Direccion" class="form-control" type="text" />
</div>

<div class="form-group">
    <label asp-for="Jornada"></label>
    @Html.DropDownList("Jornada", Html.GetEnumSelectList<TiposJornada>(), "-- Seleccione --", new {@class="form-control"})
</div>

Edit.cshtml

@model Curso

@{
    ViewData["Title"] = "Edición de Curso";
}

<h1>@ViewData["Title"]</h1>

<div asp-validation-summary="All"></div>
<form method="POST">
    
    <input type="hidden" asp-for="Id" />

    <partial name="Details" />


    <button class="btn btn-primary" type="submit">Editar</button>
</form>

Solución del reto:

Modificar ListaObjetoEscuela.cshtml para agregar link que permita editar cada item de la lista:

<table class="table table-dark table-hover">
  <thead>
    <tr>
      <th scope="col">Nombre</th>
      <th scope="col">Id</th>
    </tr>
  </thead>
  <tbody>
@foreach(var obj in Model)
{
      <tr>
          <td>@obj.Nombre</td>
          <td>@obj.Id</td>
          <td>
              @Html.ActionLink("Editar", "Edit", new { id = obj.Id })
          </td>
      </tr>
}
  </tbody>
</table>

Adicionar métodos para editar en CursoController.cs

public ActionResult Edit(string id)
        {
            if (id == null)
            {
                return BadRequest();
            }
            Curso curso = _context.Cursos.SingleOrDefault(item => item.Id == id);
            if (curso == null)
            {
                return NotFound();
            }
            return View(curso);
        }

        [HttpPost]
        public ActionResult Edit(Curso curso)
        {
            if (ModelState.IsValid)
            {
                _context.Entry(curso).State = EntityState.Modified;
                _context.SaveChanges();

                return View("Index", curso);
            }
            return View(curso);
        }

Crear vista Edit.cshtml

@model Curso

@{
    ViewData["Title"] = "Edicion del Curso";
    Layout = "Simple";
}

<h1>@ViewData["Title"]</h1>

<div asp-validation-summary="All"></div>
<form method="POST">
    <div>
        <label asp-for="Nombre"></label>
        <input asp-for="Nombre" />
    </div>
    <div>
        <label asp-for="Dirección"></label>
        <input asp-for="Dirección" />
    </div>
    <div>
        <label asp-for="Jornada"></label>
        @Html.DropDownList(
           "Jornada",Html.GetEnumSelectList<TiposJornada>(),
           "Seleccione Joirnada",
           new {@class = "form-control"}
       )
    </div>
    <input type="submit" />
</form>


<p><i>@ViewBag.Fecha</i></p>

Asi quedamoron mis metodos del Controlador

public IActionResult Edit(string id)
        {
            var modelo = from fila in _context.Cursos
                         where fila.Id == id
                         select fila;

            return View(modelo.Single());
        }
        [HttpPost]
        public IActionResult Edit(Curso curso)
        {
            try
            {
                _context.Cursos.Update(curso);
                _context.SaveChanges();
                ViewBag.RegistroActualizado = true;
            }
            catch (Exception ex)
            {
                ViewBag.RegistroActualizado = false;
                ViewBag.ErrorMessage = ex.Message;
            }
            return View(curso);
        }
        public IActionResult Delete(string id)
        {
            var modelo = from fila in _context.Cursos
                         where fila.Id == id
                         select fila;

            return View(modelo.Single());
        }
        [HttpPost]
        public IActionResult Delete(Curso curso)
        {
            try
            {
                _context.Cursos.Remove(curso);
                _context.SaveChanges();
                ViewBag.RegistroEliminado = true;
                
                var cursos = _context.Cursos;
                return View("Todos",cursos);
            }
            catch (Exception ex)
            {
                ViewBag.RegistroEliminado = false;
                ViewBag.ErrorMessage = ex.Message;
            }
            return View(curso);
        }

Para realzar el reto opte por organizar en el menu el contenido luego re utilice el create para generar el update y el delete en los cursos. Me parece importante que se tenga claro los datos que tiene cada modelo y ver que podemos reutilizar para no re escribir codigo.

Al momento de realizar las mejores, decidí hacerlo por FLUENT API, en lo personal me siento mas cómodo y mas organizado, permitiendo a su vez escalabilidad en la base de datos.

  protected override void OnModelCreating(ModelBuilder builder)
    {
        builder.Entity<Escuela>(escuela => {
            escuela.HasKey(e => e.Id).HasName("IdEscuela");
            escuela.Property(e => e.Nombre).HasMaxLength(50);
            escuela.Property(e => e.Dirección).HasMaxLength(50);
            escuela.Property(e => e.Pais).HasMaxLength(50);
            escuela.Property(e => e.Ciudad).HasMaxLength(50);
            escuela.Property(e => e.TipoEscuela);
            escuela.Property(e => e.AñoDeCreación);
        });

        builder.Entity<Curso>(curso => {
            curso.HasKey(c => c.Id).HasName("IdCurso");
            curso.HasOne(c => c.Escuela).WithMany(e => e.Cursos).HasForeignKey(c => c.EscuelaId);
            curso.Property(c => c.Nombre).HasMaxLength(50);
            curso.Property(c => c.Dirección);
            curso.Property(c => c.Jornada);
        });

        builder.Entity<Asignatura>(asignatura => {
            asignatura.HasKey(a => a.Id);
            asignatura.HasOne(a => a.Curso).WithMany(c => c.Asignaturas).HasForeignKey(a => a.CursoId);

            asignatura.Property(a => a.Nombre).HasMaxLength(50);
        });

        builder.Entity<Alumno>(alumno => {
            alumno.HasKey(a => a.Id);
            alumno.HasOne(a => a.Curso).WithMany(c => c.Alumnos).HasForeignKey(a => a.CursoId);

            alumno.Property(a => a.Nombre).HasMaxLength(50);
        });

        builder.Entity<Evaluación>(evaluacion => {
            evaluacion.HasKey(e => e.Id);
            evaluacion.HasOne(e => e.Alumno).WithMany(a => a.Evaluaciones).HasForeignKey(e => e.AlumnoId);
            evaluacion.HasOne(e => e.Asignatura).WithMany(a => a.Evaluaciones).HasForeignKey(e =>  e.AsignaturaId);
            evaluacion.Property(e => e.Nota);
        });

        Escuela e = CargarEscuela();
        builder.Entity<Escuela>().HasData(e);

        List<Curso> cursos = CargarCurso(e);
        builder.Entity<Curso>().HasData(cursos);

        List<Asignatura> asignaturas = CargarAsignaturas(cursos);
        builder.Entity<Asignatura>().HasData(asignaturas);

        List<Alumno> alumnos = CargarAlumnos(cursos);
        builder.Entity<Alumno>().HasData(alumnos);
    }

Para el tema de eliminar se agrego un modal para asegurar que realmente se quiera eliminar ese dato, por lo demas se realizo el editar y demas caracteristicas segun lo solicitado.
repositorio git hub:
https://github.com/jlsalcedor/escuela-c-.git

Dejo la solución para Editar Asignatura que es más completa que la de Curso porque muestra como seleccionar el curso correspondiente a la asignatura.

Los métodos de edición en el modelo:

public IActionResult Update(string id)
        {   
            if(!string.IsNullOrWhiteSpace(id))
            {
                var asignatura = from asig in _context.Asignaturas where asig.Id == id select asig;
                var cursos = (from curs in _context.Cursos select curs).ToList();
                var lista = new List<SelectListItem>();
                foreach (Curso curs in cursos)
                {
                    lista.Add(new SelectListItem { Text = curs.Nombre, Value = curs.Id });
                }
                ViewBag.Cursos = lista;
                ViewBag.Fecha = DateTime.Now;             
                return View(asignatura.SingleOrDefault());
            }
            return  View("MultiAsignatura", _context.Asignaturas);
        }

        [HttpPost]
        public IActionResult Update(string id, Asignatura asignatura)
        {
            ViewBag.Fecha = DateTime.Now;
            if(ModelState.IsValid)
            {
                var tmpAsignatura = from asig in _context.Asignaturas where asig.Id == id select asig;
                _context.Asignaturas.Remove(tmpAsignatura.FirstOrDefault());
                _context.Asignaturas.Add(asignatura);
                _context.SaveChanges();
                ViewBag.MensajeExtra = "Asignatura editado";
                return View("Index", asignatura);
            }
            return View(asignatura);
        }

La vista de edición que se llama Update:

@model Asignatura

@{
    ViewData["Title"] = "Edición de Asignatura";
    Layout = "Simple";
}

<h1>@ViewData["Title"]</h1>
<h2>@ViewBag.MesajeExtra</h2>

<div asp-validation-summary="All"></div>
<form method="POST">
    <div>
        <label asp-for="Nombre"></label>    
        <input asp-for="Nombre"/>
    </div>
    <div>
        <label asp-for="Curso"></label>
        @Html.DropDownList(
            "CursoId", 
            @ViewBag.Cursos, 
            "Seleccione...", 
            new {@class = "form-control"}
        )
    </div>
    <input type="submit"/>
</form>

<p>@ViewBag.Fecha</p>

Lo realice con vistas parciales, lo comparto si a alguien le sirve.
Controlador

public IActionResult Create()
        {
            ViewBag.CourseId = new SelectList(_context.Courses, "Id", "Name");
            return View(new Subject());
        }

Vista

@model Subject
@{
    ViewData["Title"] = "Create Subject";
    ViewData["Method"] = "Create";
}
<h1>@ViewData["Title"]</h1>
<partial name="FormSchoolBase" view-data="ViewData" />

Vista Parcial

@model SchoolBase
<div asp-validation-summary="All" ></div>
<form asp-action=@ViewData["Method"] method="post">
    <input type="hidden" asp-for="Id">
    <div class="form-group">
        <label asp-for="Name"></label>
        <input asp-for="Name" class="form-control">
    </div>
    @if (Model is Course)
    {
        var aux = Model as Course;
        @Html.Hidden("SchoolId", aux.SchoolId)
        <div class="form-group">
            @Html.LabelFor(model => aux.Address)
            @Html.TextBox("Address", aux.Address, null, new { @class = "form-control"})
        </div>
        <div class="form-group">
            @Html.LabelFor(model => aux.Schedule)
            @Html.DropDownList("Schedule", Html.GetEnumSelectList<Schedules>(), null, new { @class="form-control" })
        </div>
    }else if (Model is Student || Model is Subject)
    {
        var aux = Model as Student;
        <div class="form-group">
            @Html.LabelFor(model => aux.CourseId)
            @Html.DropDownList("CourseId", ViewBag.CourseId, null, new { @class="form-control" })
        </div>
    }    
    <input type="submit" class="btn btn-success" value="Send">
    <a asp-action="Index" class="btn btn-secondary">Return</a>
</form>

Controller

 public IActionResult Edit(string Id)
        {
            ViewBag.Fecha = DateTime.Now;
            Curso model = new Curso();
            using (var db = _context)
            {
                var dataCurso = db.Cursos.Find(Id);
                model.Nombre = dataCurso.Nombre;
                model.Dirección = dataCurso.Dirección;
                model.Jornada = dataCurso.Jornada;
                model.Id = dataCurso.Id;
            }

            return View(model);
        }
        [HttpPost]
        public IActionResult Edit(Curso model)
        {
            ViewBag.Fecha = DateTime.Now;
            if (!ModelState.IsValid)
            {
                return View(model);

            }
            using (var db = _context)
            {
                var dataCurso = db.Cursos.Find(model.Id);
                dataCurso.Nombre = model.Nombre;
                dataCurso.Dirección = model.Dirección;
                dataCurso.Jornada = model.Jornada;
                dataCurso.Id = model.Id;

                db.Cursos.Attach(dataCurso);
                db.Entry(dataCurso).State = EntityState.Modified;
                db.SaveChanges();
            }


            return Redirect(Url.Content("//localhost:5001/Curso"));


        }

        public IActionResult Delete(string Id)
        {

            ViewBag.Fecha = DateTime.Now;
            ViewBag.MensajeExtra = "Todo se logra";
            Curso model = new Curso();
            using (var db = _context)
            {
                var dataCurso = db.Cursos.Find(Id);
                model.Nombre = dataCurso.Nombre;
                model.Dirección = dataCurso.Dirección;
                model.Jornada = dataCurso.Jornada;
                model.Id = dataCurso.Id;
            }


            return View(model);
        }

        [HttpPost]
        public IActionResult Delete(Curso model)
        {
            ViewBag.Fecha = DateTime.Now;
             
            using (var db = _context)
            {
                var dataCurso = (from cur in db.Cursos
                                  where cur.Id == model.Id
                                   select cur).Single();
                
                db.Cursos.Remove(dataCurso);
                db.SaveChanges();
            }


            return Redirect(Url.Content("//localhost:5001/Curso"));


        }

View

@*
@model List<ObjetoEscuelaBase>
*@


<table class="table table-dark table-hover">
  <thead>
    <tr>
      <th scope="col">Nombre</th>
      <th scope="col">Id</th>
    </tr>
  </thead>
  <tbody>
@foreach(var obj in Model)
{
    <tr>
      <td>@obj.Nombre</td>
      <td>@obj.Id</td>
      <td>
        <input onclick= "document.location.href= '//localhost:5001/Curso/Delete/@obj.Id'" type="button" value="Eliminar" class="btn btn-danger"> </input>
        <input onclick= "document.location.href= '//localhost:5001/Curso/Edit/@obj.Id'"  type="button" value="Editar" class="btn btn-default"/>
      </td>
    </tr>

Archivos

     public IActionResult Update(string id)
    {
         ViewBag.Fecha = DateTime.Now;
         var curso = _context.Cursos.FirstOrDefault(c => c.Id == id);
        return View(curso); 
    }

     [HttpPost]
    public IActionResult Update(Curso curso)
    {
         ViewBag.Fecha = DateTime.Now;
         if (ModelState.IsValid) {
            _context.Cursos.Update(curso);
            _context.SaveChanges();
            ViewBag.MensajeCrecion = "Registro Modificado";
            return View();
         } else {
            return View(curso); 
         }
        
    }

Vamos a ello

Codigo de la Vista Update:

@model Curso

@{
    ViewData["Title"] = "Modificar un Curso";
    Layout = "Simple";
}

<h1>@ViewData["Title"]</h1>

<div asp-validation-summary="All"></div>
<form method="post">
    <div>
        <label asp-for="Id"></label>
        <input asp-for="Id" readonly />
    </div>
    <div>
        <label>Nombre:</label>
        <input asp-for="Nombre" type="text" required />
    </div>
    <div>
        <label>Dirección:</label>
        <input asp-for="Dirección" />
    </div>
    <div>
        <label>Jornada:</label>
        @Html.DropDownList("Jornada", Html.GetEnumSelectList<TiposJornada>(),
        "Seleccione una Jornada", //Texto por defecto
        new { @class = "form-control" } ///Estilo
        )
    </div>
    <input type="submit" />
</form>

<p>
    <i>
        @ViewBag.Fecha
    </i>
</p>

Clase CursoController
Método para Cargar los datos en los textbox:

public IActionResult Update(string Id)
        {
            ViewBag.Fecha = DateTime.Now;

            var curso = from cur in _context.Cursos
                        where cur.Id == Id
                        select cur;

            return View(curso.SingleOrDefault());
        }

Método para realizar la modificación:

 [HttpPost]
            public IActionResult Update(Curso curso)
            {
                ViewBag.Fecha = DateTime.Now;
                if (ModelState.IsValid)
                {
                    Curso cursoDb = _context.Cursos.Where(c => c.Id == curso.Id).SingleOrDefault();
                    cursoDb.Nombre = curso.Nombre;
                    cursoDb.Jornada = curso.Jornada;

                    _context.Cursos.Update(cursoDb);
                    _context.SaveChanges();
                    ViewBag.MensajeConfirmacion = "El Curso ha sido modificado satisfactoriamente.";

                    return View("Index", curso);
                }
                else
                {
                    return View(curso);
                }
            }

¿Es necesario crear una variable temporal “cursoDb” para actualizar los campos? En mi caso, solamente he pasado el id del curso que deseo modificar y con “_context.Cursos.Update(curso);” se actualiza. ¿Es correcto? Gracias

 @model Curso

        @{
            ViewData["Title"] = "Actualización de Curso";
            Layout = "Simple";
        }

        <h1>@ViewData["Title"]</h1>

        <div asp-validation-summary="All"></div>
        <form method = "POST">
            <div>
                <label asp-for="Id"></label>
                <input asp-for="Id"/>
            </div>
            <div>
                <label asp-for="Nombre"></label>
                <input asp-for="Nombre"/>
            </div>
            <div>
                <label asp-for="Dirección"></label>
                <input asp-for="Dirección"/>
            </div>
            <div>
                <label asp-for="Jornada"></label>
                @Html.DropDownList(
                    "Jornada",Html.GetEnumSelectList<TiposJornada>(),
                    "Selecciona jornada",
                    new {@class = "form-control"}
                )
            </div>
            <input type = "submit"/>
        </form>

        <p><i>@ViewBag.Fecha </i></p>


        [HttpPost]
        public IActionResult Update(Curso curso)
        {
            ViewBag.Fecha = DateTime.Now;

            if (ModelState.IsValid){

                var escuela = _context.Escuelas.FirstOrDefault();

                curso.EscuelaId = escuela.Id;
                _context.Cursos.Update(curso);
                _context.SaveChanges();
                ViewBag.MensajeExtra = "Curso Actualizado";
                return View("Index", curso);
            }      
            else
            {
                return View(curso);
            }     
        }```

Comparto mi repositorio:

Github

Cumpliendo con el reto:

CRUD Cursos

CRUD Asignaturas

CRUD Alumnos

El hash del repo asociado a estos cambios es el siguiente

vamos por el reto!

   [HttpPost]
    public IActionResult Update( Curso curso)
    {

        if (!ModelState.IsValid)
        {
            return View(curso);
        }

        _context.Update(curso);
        _context.SaveChanges();
        return View("Index", curso);
    }
     public IActionResult Update(string id)
    {
         ViewBag.Fecha = DateTime.Now;
         var curso = _context.Cursos.FirstOrDefault(c => c.Id == id);
        return View(curso); 
    }

     [HttpPost]
    public IActionResult Update(Curso curso)
    {
         ViewBag.Fecha = DateTime.Now;
         if (ModelState.IsValid) {
            _context.Cursos.Update(curso);
            _context.SaveChanges();
            ViewBag.MensajeCrecion = "Registro Modificado";
            return View();
         } else {
            return View(curso); 
         }
        
    }

Janer

No me deja publicar

Bien.

Reto cumplido

les dejo aqui el repo de mi solución por si en algun punto se quieren guiar, me referencia bastante de las soluciones de los demas compañeros para poder culminar el reto, gracias comunidad.

Link repo: https://github.com/jdacdev/ProyectoEscuelasASP.NET
Branch : CRUD

Yo lo implemente de esta forma. Estaba buscando como implentar un mensaje de validación con un form de la siguiente forma

DialogResult result1 = MessageBox.Show("Is Dot Net Perls awesome?",
    "Important Question",
    MessageBoxButtons.YesNo);

Pero no lo pude implementar me decía: error CS0246: El nombre del tipo o del espacio de nombres ‘DialogResult’ no se encontró (¿falta una directiva using o una referencia de ensamblado?)

https://www.dotnetperls.com/messagebox-show

Alguien me puede ayudar con ello? y lo siguiente fue lo que implemente para cada uno de los controladores

 	public IActionResult Update(string id)
        {
            var curso = from cur in _context.Cursos
                        where cur.Id == id
                        select cur;

            return View(curso.SingleOrDefault());
        }
	
	//...

	[HttpPost]
        public IActionResult Update(Curso curso, string id = "")
        {
            if(ModelState.IsValid){

                var curs = from cur in _context.Cursos
                        where cur.Id == id
                        select cur;
                
                curs.SingleOrDefault().Nombre = curso.Nombre; 
                curs.SingleOrDefault().Dirección = curso.Dirección; 
                curs.SingleOrDefault().Jornada = curso.Jornada; 

                _context.Cursos.Update(curs.SingleOrDefault());
                _context.SaveChanges();

                ViewBag.Fecha = DateTime.Now;

                return View("Index",curso);
            }else{
                return View();
            }
        }

	[Route("Curso/Delete/{id?}/{delete?}")]
        public IActionResult Delete(string id, bool delete = false)
        {
    
            var curso = from cur in _context.Cursos
                        where cur.Id == id
                        select cur;

            ViewBag.MainCtrl = "Curso";
            ViewBag.Fecha = DateTime.Now;
            if(delete == true){
                _context.Cursos.Remove(curso.SingleOrDefault());
                _context.SaveChanges();

                var cursos = _context.Cursos;

                return View("MultiCursos",cursos);
            }else{
                return View(curso.SingleOrDefault());
            }

        }
	

se implemento la creación, edición y eliminación de cursos, asignaturas y alumnos, se reutilizo la vista multi para todos las entidades
Vista Multi Curso

Vista Multi Asignatura
![](url)

Codigo Curso
![](
![](
![](
![](

Reto:
En mi caso me enfoque solo en la funcionalidad, editar y eliminar.
Lo hice en la misma plantilla Create.

Create.cshtml

@model Curso //hacerlo fuertemente tipado

@{
    ViewData["Title"] = "Información Curso";
    Layout = "Simple";
}

<h1>@ViewData["Title"]</h1>

<div asp-validation-summary="All"></div> <!-- Muestra el resumen de todas las validaciones -->
<form method="POST">
    <div>
        <label asp-for="Nombre"></label>
        <input asp-for="Nombre"/>
    </div>
    <div>
        <label asp-for="Direccion"></label>
        <input asp-for="Direccion"/>
    </div>
    <div>
        <label asp-for="Jornada"></label>
        @Html.DropDownList(
            "Jornada",Html.GetEnumSelectList<TiposJornada>(),
            "Seleccione una jornada",
            new{@class="form-control"}
        )
    </div>
    @if (Model == null){
        <input type="submit" value="create"/>
    }else{
        <input type="submit" value="update"/>
        <input type="submit" value="delete" name="delete"/>
    }
</form>

<p><i>@ViewBag.Fecha</i></p>

CursoController.cs

using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.AspNetCore.Mvc;
using platzi_asp_net_core.Models;

namespace platzi_asp_net_core.Controllers
{
    public class CursoController : Controller
    {
        public IActionResult Index(string id)
        {
            if (!string.IsNullOrWhiteSpace(id))
            {
                var curso = from cur in _context.Cursos
                            where cur.Id == id
                            select cur;
                return View(curso.SingleOrDefault());
            }
            else
            {
                return View("MultiCurso", _context.Cursos);
            }
        }
        public IActionResult MultiCurso()
        {
            ViewBag.CosaDinamica = "La monja"; //ViewBag manda info a la vista
            ViewBag.Fecha = DateTime.Now;

            return View("MultiCurso", _context.Cursos);
        }
        public IActionResult Create(string id)
        {
            if (!string.IsNullOrWhiteSpace(id))
            {
                var curso = from cur in _context.Cursos
                            where cur.Id == id
                            select cur;
                return View(curso.SingleOrDefault());
            }
            else
            {
                return View();
            }
        }

        [HttpPost] //se dispara cuando lo invocan por post
        public IActionResult Create(Curso curso, string delete)
        {
            ViewBag.Fecha = DateTime.Now;
            string mensaje;

            if (ModelState.IsValid)
            {
                var escuela = _context.Escuelas.FirstOrDefault();
                curso.EscuelaId = escuela.Id;

                if (ExisteCurso(curso.Id))
                {
                    if (delete != "delete")
                    {
                        _context.Cursos.Update(curso);
                        mensaje = "Curso Actualizado"; 
                    }
                    else
                    {
                        _context.Cursos.Remove(curso);
                        mensaje = "Curso Eliminado";
                    }
                }
                else
                {
                    _context.Cursos.Add(curso);
                    mensaje = "Curso Creado";
                }
                _context.SaveChanges();
                ViewBag.MensajeExtra = mensaje;
                return View("Index", curso);
            }
            else
            {
                return View(curso);
            }
        }
        public bool ExisteCurso(string id)
        {
            var curso = (from cur in _context.Cursos
                         where cur.Id == id
                         select cur).Count();
            return (curso > 0) ? true : false;

        }
        private EscuelaContext _context;
        public CursoController(EscuelaContext context)
        {
            _context = context;
        }
    }
}

En CursoController agregué este método:

[HttpPost]
[Route("Curso/Edit/{cursoId}")]
public IActionResult Edit(Curso curso) {
    if(ModelState.IsValid) {
        _context.Cursos.Update(curso);
        _context.SaveChanges();

        return View("Index", curso);
    }

    return View(curso);
}

Cloné la vista Create.cshtml con nombre Edit.cshtml, y agregué un inputo oculto con el Id del Curso:

<form method="POST">
    <input type="hidden" asp-for="Id">
public IActionResult Edit(string Id)
        {
            Curso oCurso = new Curso();
            ViewBag.Fecha = DateTime.Now;

            var Cursos = from curso in _context.Cursos
                         where curso.Id == Id
                         select curso;

            foreach (var item in Cursos)
            {
                oCurso.Id = item.Id;
                oCurso.Nombre = item.Nombre;
                oCurso.Dirección = item.Dirección;
                oCurso.Jornada = item.Jornada;
            }

            return View(oCurso);
        }
        [HttpPost]
        public IActionResult Edit(Curso oCurso)
        {
            if (ModelState.IsValid)
            {
                var Cursos = (from curso in _context.Cursos
                              where curso.Id == oCurso.Id
                              select curso).ToList();

                foreach (var item in Cursos)
                {
                    item.Id = oCurso.Id;
                    item.Nombre = oCurso.Nombre;
                    item.Dirección = oCurso.Dirección;
                    item.Jornada = oCurso.Jornada;
                }

                //_context.Cursos.Add(oCurso);
                _context.SaveChanges();

                ViewBag.MensajeExtra = "Curso creado.";

                return View("Index", oCurso);
            }
            else
            {
                return View(oCurso);
            }
        }

Controlador:
controlador:

    [HttpPost]
    public IActionResult Create(Alumno alumno)
    {
        ViewBag.Fecha = DateTime.Now;
        if (ModelState.IsValid)
        {
         
            _context.Alumnos.Add(alumno);
            _context.SaveChanges();
            ViewBag.MensajeExtra = "alumno creado";
            return View("Index", alumno);
        }
        else
        {
            return View(alumno);
        }
    }


    public IActionResult Update(Alumno alumno)
    {
        ViewBag.Fecha = DateTime.Now;
        if (ModelState.IsValid)
        {
             ViewBag.MensajeExtra = "alumno modificado";                         
            _context.Alumnos.Update(alumno);
            _context.SaveChanges();
        }
        
        return View("MultiAlumno", _context.Alumnos);
    }

Vistas
Update.cshtml
@model Alumno;
@{
ViewData[“Title”] = “Acualiza Informacion Alumno”;
Layout = “Simple”;
}
<h1>Update: @ViewData[“Title”]</h1>

<form action="" method=“post”>
<div>
<label asp-for=“Nombre” ></label>
<input asp-for=“Nombre” />
</div>
<div>
<label asp-for=“CursoId” ></label>
<input asp-for=“CursoId” />
</div>
<div>
<label asp-for=“Id”></label>
<input asp-for=“Id”/>
</div>

<input type="submit" value="update">

</form>
<p><i>@ViewBag.Fecha</i></p>

create.cshtml
@model Alumno;
@{
ViewData[“Title”] = “Crear Alumno”;
Layout = “Simple”;
}
<h1>: @ViewData[“Title”]</h1>
<div asp-validation-summary=“All”></div>
<form action="" method=“post”>
<div>
<label asp-for=“Nombre”></label>
<input asp-for=“Nombre”/>
</div>
<div>
<label asp-for=“CursoId”></label>
<input asp-for=“CursoId”/>
</div>
<div>
<label asp-for=“Id”></label>
<input asp-for=“Id”/>
</div>
<input type=“submit” value=“update”>
</form>
<p><i>@ViewBag.Fecha</i></p>

AsignaturaController

[HttpPost]
public IActionResult Update(Asignatura asignatura)
{
ViewBag.Fecha = DateTime.Now;
if (ModelState.IsValid)
{
// curso.Nombre = escuela.Nombre;
_context.Asignaturas.Update(asignatura);
_context.SaveChanges();
}

        return View("MultiAsignatura", _context.Asignaturas);
    }


   [HttpPost]
    public IActionResult Create(Asignatura asignatura)
    {
        ViewBag.Fecha = DateTime.Now;
        if (ModelState.IsValid)
        {
           // var escuela = _context.Escuelas.FirstOrDefault();                
            _context.Asignaturas.Add(asignatura);
            _context.SaveChanges();
            ViewBag.MensajeExtra = "asignatura creada";
            return View("Index", asignatura);
        }
        else
        {
            return View(asignatura);
        }
    }

Create.cshtml

@model Asignatura;
@{
ViewData[“Title”] = “Crear Asignatura”;
Layout = “Simple”;
}
<h1>: @ViewData[“Title”]</h1>
<div asp-validation-summary=“All”></div>
<form action="" method=“post”>
<div>
<label asp-for=“Nombre”></label>
<input asp-for=“Nombre”/>
</div>
<div>
<label asp-for=“CursoId”></label>
<input asp-for=“CursoId”/>
</div>

<input type="submit" value="update">

</form>
<p><i>@ViewBag.Fecha</i></p>

Update.cshtml
@model Asignatura;
@{
ViewData[“Title”] = “Acualiza Informacion Asignaturas”;
Layout = “Simple”;
}
<h1>Asignatura: @ViewData[“Title”]</h1>

<form action="" method=“post”>
<div>
<label asp-for=“Nombre” ></label>
<input asp-for=“Nombre” />
</div>
<div>
<label asp-for=“CursoId” ></label>
<input asp-for=“CursoId” />
</div>
<div>
<label asp-for=“Id”></label>
<input asp-for=“Id”/>
</div>

<input type="submit" value="update">

</form>
<p><i>@ViewBag.Fecha</i></p>

   [HttpPost]
    public IActionResult Update(Alumno alumno)
    {
        ViewBag.Fecha = DateTime.Now;
        if (ModelState.IsValid)
        {
             ViewBag.MensajeExtra = "alumno modificado";                         
            _context.Alumnos.Update(alumno);
            _context.SaveChanges();
        }
        
        return View("MultiAlumno", _context.Alumnos);
    }




    [HttpPost]
    public IActionResult Create(Alumno alumno)
    {
        ViewBag.Fecha = DateTime.Now;
        if (ModelState.IsValid)
        {
         
            _context.Alumnos.Add(alumno);
            _context.SaveChanges();
            ViewBag.MensajeExtra = "alumno creado";
            return View("Index", alumno);
        }
        else
        {
            return View(alumno);
        }
    }

Vista alumno:

Create.cshtml

@model Alumno;
@{
ViewData[“Title”] = “Crear Alumno”;
Layout = “Simple”;
}
<h1>: @ViewData[“Title”]</h1>
<div asp-validation-summary=“All”></div>
<form action="" method=“post”>
<div>
<label asp-for=“Nombre”></label>
<input asp-for=“Nombre”/>
</div>
<div>
<label asp-for=“CursoId”></label>
<input asp-for=“CursoId”/>
</div>
<div>
<label asp-for=“Id”></label>
<input asp-for=“Id”/>
</div>
<input type=“submit” value=“update”>
</form>
<p><i>@ViewBag.Fecha</i></p>

update.cshtml

@model Alumno;
@{
ViewData[“Title”] = “Acualiza Informacion Alumno”;
Layout = “Simple”;
}
<h1>Update: @ViewData[“Title”]</h1>

<form action="" method=“post”>
<div>
<label asp-for=“Nombre” ></label>
<input asp-for=“Nombre” />
</div>
<div>
<label asp-for=“CursoId” ></label>
<input asp-for=“CursoId” />
</div>
<div>
<label asp-for=“Id”></label>
<input asp-for=“Id”/>
</div>

<input type="submit" value="update">

</form>
<p><i>@ViewBag.Fecha</i></p>