Está en la página 1de 4

Instituto Superior Tecnológico

Nombre: JOFRE LEMA


Código: 212218121
Materia: Aplicación Web
Tema: S2. Desarrollo de un informe de funcionamiento sobre la creación de
un CRUD en .NET
Fecha: 01/12/2021 Calificación:

Personalizar la página de detalles

En el código con scaffolding de la página Students Index se excluyó la


propiedad Enrollments porque contiene una colección. En la página Details, se mostrará el
contenido de la colección en una tabla HTML.

En Controllers/StudentsController.cs, el método de acción para la vista Details usa el


método FirstOrDefaultAsync para recuperar una única entidad Student. Agregue código para
llamar a los métodos Include, ThenInclude y AsNoTracking, como se muestra en el siguiente
código resaltado.

C#Copiar
public async Task<IActionResult> Details(int? id)
{
if (id == null)
{
return NotFound();
}

var student = await _context.Students


.Include(s => s.Enrollments)
.ThenInclude(e => e.Course)
.AsNoTracking()
.FirstOrDefaultAsync(m => m.ID == id);

if (student == null)
{
return NotFound();
}

return View(student);
}

Los métodos Include y ThenInclude hacen que el contexto cargue la propiedad de


navegación Student.Enrollments y, dentro de cada inscripción, la propiedad de
navegación Enrollment.Course. Obtendrá más información sobre estos métodos en el tutorial
de lectura de datos relacionados.

El método AsNoTracking mejora el rendimiento en casos en los que no se actualizarán las


entidades devueltas en la duración del contexto actual. Obtendrá más información
sobre AsNoTracking al final de este tutorial.
Instituto Superior Tecnológico

Datos de ruta

El valor de clave que se pasa al método Details procede de los datos de ruta. Los datos de ruta
son los que el enlazador de modelos encuentra en un segmento de la dirección URL. Por ejemplo,
la ruta predeterminada especifica los segmentos de controlador, acción e identificador:

C#Copiar
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
});

En la dirección URL siguiente, la ruta predeterminada asigna Instructor como el controlador,


Index como la acción y 1 como el identificador; estos son los valores de datos de ruta.

Copiar
http://localhost:1230/Instructor/Index/1?courseID=2021

La última parte de la dirección URL ("?courseID=2021") es un valor de cadena de consulta. El


enlazador de modelos también pasará el valor ID al parámetro id del método Index si se pasa
como un valor de cadena de consulta:

Copiar
http://localhost:1230/Instructor/Index?id=1&CourseID=2021

En la página Index, las instrucciones de la aplicación auxiliar de etiquetas crean direcciones URL
de hipervínculo en la vista de Razor. En el siguiente código de Razor, el parámetro id coincide
con la ruta predeterminada, por lo que se agrega id a los datos de la ruta.

HTMLCopiar
<a asp-action="Edit" asp-route-id="@item.ID">Edit</a>

Esto genera el siguiente código HTML cuando item.ID es 6:

HTMLCopiar
<a href="/Students/Edit/6">Edit</a>

En el siguiente código de Razor, studentID no coincide con ningún parámetro de la ruta


predeterminada, por lo que se agrega como una cadena de consulta.

HTMLCopiar
<a asp-action="Edit" asp-route-studentID="@item.ID">Edit</a>

Esto genera el siguiente código HTML cuando item.ID es 6:

HTMLCopiar
<a href="/Students/Edit?studentID=6">Edit</a>
Instituto Superior Tecnológico

Para obtener más información sobre los asistentes de etiquetas, vea Asistentes de etiquetas en
ASP.NET Core.

Agregar inscripciones a la vista de detalles

Abra Views/Students/Details.cshtml. Cada campo se muestra mediante los


asistentes DisplayNameFor y DisplayFor, como se muestra en el ejemplo siguiente:

CSHTMLCopiar
<dt class="col-sm-2">
@Html.DisplayNameFor(model => model.LastName)
</dt>
<dd class="col-sm-10">
@Html.DisplayFor(model => model.LastName)
</dd>

Después del último campo e inmediatamente antes de la etiqueta </dl> de cierre, agregue el
código siguiente para mostrar una lista de las inscripciones:

CSHTMLCopiar
<dt class="col-sm-2">
@Html.DisplayNameFor(model => model.Enrollments)
</dt>
<dd class="col-sm-10">
<table class="table">
<tr>
<th>Course Title</th>
<th>Grade</th>
</tr>
@foreach (var item in Model.Enrollments)
{
<tr>
<td>
@Html.DisplayFor(modelItem => item.Course.Title)
</td>
<td>
@Html.DisplayFor(modelItem => item.Grade)
</td>
</tr>
}
</table>
</dd>

Si la sangría de código no es correcta después de pegar el código, presione CTRL-K-D para


corregirlo.

Este código recorre en bucle las entidades en la propiedad de navegación Enrollments. Para cada
inscripción, se muestra el título del curso y la calificación. El título del curso se recupera de la
Instituto Superior Tecnológico

entidad Course almacenada en la propiedad de navegación Course de la entidad Enrollments.

Ejecute la aplicación, haga clic en la pestaña Students y después en el vínculo Details de un


estudiante. Verá la lista de cursos y calificaciones para el alumno seleccionado:

Actualizar la página Create

En StudentsController.cs, modifique el método HttpPost Create agregando un bloque try-catch y


quitando ID del atributo Bind.

C#Copiar
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Create(
[Bind("EnrollmentDate,FirstMidName,LastName")] Student student)
{
try
{
if (ModelState.IsValid)
{
_context.Add(student);
await _context.SaveChangesAsync();
return RedirectToAction(nameof(Index));
}
}
catch (DbUpdateException /* ex */)
{
//Log the error (uncomment ex variable name and write a log.
ModelState.AddModelError("", "Unable to save changes. " +
"Try again, and if the problem persists " +
"see your system administrator.");
}
return View(student);
}

En este código se agrega la entidad Student creada por el enlazador de modelos de ASP.NET Core
MVC al conjunto de entidades Students y después se guardan los cambios en la base de datos. (El
enlazador de modelos se refiere a la funcionalidad de ASP.NET Core MVC que facilita trabajar
con datos enviados por un formulario; un enlazador de modelos convierte los valores de
formulario enviados en tipos CLR y los pasa al método de acción en parámetros. En este caso, el
enlazador de modelos crea instancias de una entidad Student mediante valores de propiedad de la
colección Form).

Se ha quitado ID del atributo Bind porque ID es el valor de clave principal que SQL Server
establecerá automáticamente cuando se inserte la fila. La entrada del usuario no establece el valor
ID.

También podría gustarte