A煤n no tienes acceso a esta clase

Crea una cuenta y contin煤a viendo este curso

Curso de ASP.NET Core

Curso de ASP.NET Core

Juan Carlos Ruiz

Juan Carlos Ruiz

Tu primer Reto

28/35
Recursos

Aportes 39

Preguntas 2

Ordenar por:

驴Quieres ver m谩s aportes, preguntas y respuestas de la comunidad? Crea una cuenta o inicia sesi贸n.

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 鈥淢ulti鈥

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茅 鈥淩edirectToAction鈥 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 鈥淪caffolding鈥 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.

隆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 鈥淎signatura鈥 y 鈥淎lumno鈥 para crear y actualizar no deber铆a de haber diferencia con respecto a 鈥淐urso鈥.

  1. Agregue la view 鈥淯pdate.cshtml鈥 (copiandola de 鈥淐reate.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);
    }
}

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.

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>

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);
                }
            }

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.

驴Es necesario crear una variable temporal 鈥渃ursoDb鈥 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 鈥楧ialogResult鈥 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
![](
![](
![](
![](

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);
        }

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[鈥淭itle鈥漖 = 鈥淎cualiza Informacion Alumno鈥;
Layout = 鈥淪imple鈥;
}
<h1>Update: @ViewData[鈥淭itle鈥漖</h1>

<form action="" method=鈥減ost鈥>
<div>
<label asp-for=鈥淣ombre鈥 ></label>
<input asp-for=鈥淣ombre鈥 />
</div>
<div>
<label asp-for=鈥淐ursoId鈥 ></label>
<input asp-for=鈥淐ursoId鈥 />
</div>
<div>
<label asp-for=鈥淚d鈥></label>
<input asp-for=鈥淚d鈥/>
</div>

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

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

create.cshtml
@model Alumno;
@{
ViewData[鈥淭itle鈥漖 = 鈥淐rear Alumno鈥;
Layout = 鈥淪imple鈥;
}
<h1>: @ViewData[鈥淭itle鈥漖</h1>
<div asp-validation-summary=鈥淎ll鈥></div>
<form action="" method=鈥減ost鈥>
<div>
<label asp-for=鈥淣ombre鈥></label>
<input asp-for=鈥淣ombre鈥/>
</div>
<div>
<label asp-for=鈥淐ursoId鈥></label>
<input asp-for=鈥淐ursoId鈥/>
</div>
<div>
<label asp-for=鈥淚d鈥></label>
<input asp-for=鈥淚d鈥/>
</div>
<input type=鈥渟ubmit鈥 value=鈥渦pdate鈥>
</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[鈥淭itle鈥漖 = 鈥淐rear Asignatura鈥;
Layout = 鈥淪imple鈥;
}
<h1>: @ViewData[鈥淭itle鈥漖</h1>
<div asp-validation-summary=鈥淎ll鈥></div>
<form action="" method=鈥減ost鈥>
<div>
<label asp-for=鈥淣ombre鈥></label>
<input asp-for=鈥淣ombre鈥/>
</div>
<div>
<label asp-for=鈥淐ursoId鈥></label>
<input asp-for=鈥淐ursoId鈥/>
</div>

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

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

Update.cshtml
@model Asignatura;
@{
ViewData[鈥淭itle鈥漖 = 鈥淎cualiza Informacion Asignaturas鈥;
Layout = 鈥淪imple鈥;
}
<h1>Asignatura: @ViewData[鈥淭itle鈥漖</h1>

<form action="" method=鈥減ost鈥>
<div>
<label asp-for=鈥淣ombre鈥 ></label>
<input asp-for=鈥淣ombre鈥 />
</div>
<div>
<label asp-for=鈥淐ursoId鈥 ></label>
<input asp-for=鈥淐ursoId鈥 />
</div>
<div>
<label asp-for=鈥淚d鈥></label>
<input asp-for=鈥淚d鈥/>
</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[鈥淭itle鈥漖 = 鈥淐rear Alumno鈥;
Layout = 鈥淪imple鈥;
}
<h1>: @ViewData[鈥淭itle鈥漖</h1>
<div asp-validation-summary=鈥淎ll鈥></div>
<form action="" method=鈥減ost鈥>
<div>
<label asp-for=鈥淣ombre鈥></label>
<input asp-for=鈥淣ombre鈥/>
</div>
<div>
<label asp-for=鈥淐ursoId鈥></label>
<input asp-for=鈥淐ursoId鈥/>
</div>
<div>
<label asp-for=鈥淚d鈥></label>
<input asp-for=鈥淚d鈥/>
</div>
<input type=鈥渟ubmit鈥 value=鈥渦pdate鈥>
</form>
<p><i>@ViewBag.Fecha</i></p>

update.cshtml

@model Alumno;
@{
ViewData[鈥淭itle鈥漖 = 鈥淎cualiza Informacion Alumno鈥;
Layout = 鈥淪imple鈥;
}
<h1>Update: @ViewData[鈥淭itle鈥漖</h1>

<form action="" method=鈥減ost鈥>
<div>
<label asp-for=鈥淣ombre鈥 ></label>
<input asp-for=鈥淣ombre鈥 />
</div>
<div>
<label asp-for=鈥淐ursoId鈥 ></label>
<input asp-for=鈥淐ursoId鈥 />
</div>
<div>
<label asp-for=鈥淚d鈥></label>
<input asp-for=鈥淚d鈥/>
</div>

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

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