我试图在我的一个表中实现排序功能。我使用这些文档作为参考--> https://learn.microsoft.com/en-us/aspnet/core/data/ef-rp/sort-filter-page?view=aspnetcore-3.1#add-sorting
我已经成功地用行加载了表,并且可以通过在变量sortOrder中应用不同的值(我指硬编码)来更改顺序。
当我试图单击列标题(使用锚标记)时,我遇到了一个问题。例如,当我在列标题Nombre中单击时,sortOrder变量应该会更改。
<a asp-page="/Administracion/Capacitaciones/InscriptosPartialModel?Id=@Model.CursoId" asp-route-sortOrder="@Model.NameSort">
@Html.DisplayNameFor(model => model.Alumnos[0].Nombre)</a>
但是,我不会只接收get参数nameSort,只接收Id。根据文档,它也应该附加asp-route-sortOrder属性的sortOrder。
我尝试删除属性asp-route-sortOrder并使用url ->中的get参数生成URL。
asp-page="/Administracion/Capacitaciones/InscriptosPartialModel?Id=@Model.CursoId&sortOrder=@Model.NameSort"
但我在那里还是会空的。也许这和局部有关。它将表作为一个部分返回,也许我失去了变量的引用。
RegisteredUsers.cshtml
@page
@model Administracion.Capacitaciones.InscriptosPartialModel
@{
}
<div id="inscriptos"></div>
@section scripts {
<script>
$('#inscriptos')
.load('/Administracion/Capacitaciones/InscriptosPartialModel/InscriptosPartial?Id=' + cursoId, function () {
// I have some UI events here, ommiting them for simplicity
}
</script>
InscriptosPartialModel.cshtml.cs (路径-> Administracion\Capacitaciones\InscriptosPartialModel.cshtml.cs) )
public class InscriptosPartialModel : PageModel
{
public List<UsuarioInscriptoCursoModel> Alumnos { get; set; }
public string NameSort { get; set; }
public string DniSort { get; set; }
public string _sortOrder { get; set; }
public IQueryable<UsuarioInscriptoCursoModel> AlumnosIQ { get; set; }
private IInscripcionRegistroCursoRepository ircRepo;
private ICursoRepository _cursoRepo;
public int CursoId { get; set; }
public string NombreCurso { get; set; }
public InscriptosPartialModel(
IInscripcionRegistroCursoRepository inscripcionRegistroCursoRepository,
ICursoRepository cursoRepository)
{
ircRepo = inscripcionRegistroCursoRepository;
_cursoRepo = cursoRepository;
}
public void OnGet(int Id, string sortOrder)
{
CursoId = Id;
NombreCurso = _cursoRepo.GetById(Id).Nombre;
NameSort = String.IsNullOrEmpty(sortOrder) ? "name_desc" : "";
DniSort = sortOrder == "dni" ? "dni_desc" : "dni";
_sortOrder = sortOrder;
}
public async Task<PartialViewResult> OnGetInscriptosPartialAsync(int Id)
{
AlumnosIQ = ircRepo.GetAlumnosByCursoId(Id, _sortOrder);
if (AlumnosIQ.Count() > 0)
{
Alumnos = await AlumnosIQ.AsNoTracking().ToListAsync();
return Partial("_InscriptosTable", this);
}
else
{
return Partial("_EmptyData");
}
}
}
_InscriptosTable.cshtml
@using Models
@model InscriptosPartialModel
<table class="table table-striped">
<thead class="table_header">
<tr>
<th class="text-center"><input id="selectAll" type="checkbox" /></th>
<th>
<a asp-page="/Administracion/Capacitaciones/InscriptosPartialModel?Id=@Model.CursoId" asp-route-sortOrder="@Model.NameSort">
@Html.DisplayNameFor(model => model.Alumnos[0].Nombre)
</a>
</th>
<th>@Html.DisplayNameFor(model => model.Alumnos[0].Apellido)</th>
<th>
<a asp-page="/Administracion/Capacitaciones/InscriptosPartialModel?Id=@Model.CursoId" asp-route-sortOrder="@Model.DniSort">
@Html.DisplayNameFor(model => model.Alumnos[0].Dni)
</a>
</th>
<th>@Html.DisplayNameFor(model => model.Alumnos[0].ModulosInscripto.NombreModulo)</th>
<th>@Html.DisplayNameFor(model => model.Alumnos[0].Asistencia)</th>
<th>@Html.DisplayNameFor(model => model.Alumnos[0].Calificacion)</th>
<th></th>
</tr>
</thead>
<tbody>
@foreach (var alumno in Model.Alumnos)
{
<tr>
<td class="text-center">
<input type="checkbox"
data-alumno="@alumno.Id"
data-modulo="@alumno.ModulosInscripto.ModuloId"
name="select-@alumno.Dni"
@(alumno.CumpleAsistencia() ? "disabled" : "") />
</td>
<td>@Html.DisplayFor(modelItem => alumno.Nombre)</td>
<td>@Html.DisplayFor(modelItem => alumno.Apellido)</td>
<td>@Html.DisplayFor(modelItem => alumno.Dni)</td>
<td>@Html.DisplayFor(modelItem => alumno.ModulosInscripto.NombreModulo)</td>
<td>
@{
var encuentros = alumno.Asistencia + " / " + alumno.CantidadEncuentros;
@Html.DisplayFor(m => encuentros)
}
</td>
<td>@Html.DisplayFor(modelItem => alumno.Calificacion)</td>
<td>
<button type="button"
class="btn btn-primary button_lenga_primary"
id="desuscribirBtn"
data-mod="@alumno.ModulosInscripto.ModuloId"
data-alu="@alumno.Id"
data-dni="@alumno.Dni"
data-namemod="@alumno.ModulosInscripto.NombreModulo"
data-toggle="modal"
data-target="#desuscribir-modal">
Quitar
</button>
</td>
</tr>
}
</tbody>
</table>
InscripcionRegistroCursoRepository.cs
public class InscripcionRegistroCursoRepository : GenericRepository<InscripcionRegistroCurso>, IInscripcionRegistroCursoRepository
{
public InscripcionRegistroCursoRepository(LengaContext context) : base(context)
{
}
public IQueryable<UsuarioInscriptoCursoModel> GetAlumnosByCursoId(int CursoId, string sortOrder)
{
var inscripciones = context.Inscripciones
.Where(row => row.InscripcionRegistroCursoId == CursoId);
var query = (from inscripcion in inscripciones
join alumno in context.Alumnos on inscripcion.AlumnoId equals alumno.AlumnoId
join usuario in context.UsuariosExternos on alumno.AlumnoId equals usuario.AlumnoId
select new UsuarioInscriptoCursoModel
{
Nombre = usuario.Nombre,
Apellido = usuario.Apellido,
Dni = usuario.Dni,
Id = usuario.AlumnoId,
ModulosInscripto = inscripcion.Modulo,
Asistencia = inscripcion.Asistencia,
Calificacion = inscripcion.Calificacion,
CantidadEncuentros = inscripcion.Modulo.Encuentros
})
.Distinct();
switch (sortOrder) {
case "name_desc":
query = query.OrderByDescending(a => a.Nombre);
break;
case "dni":
query = query.OrderBy(a => a.Dni);
break;
case "dni_desc":
query = query.OrderByDescending(a => a.Dni);
break;
default:
query = query.OrderBy(a => a.Nombre);
break;
}
return query;
}
}
有什么想法吗?谢谢
发布于 2022-02-23 03:11:01
首先,当你使用
$('#inscriptos')
.load('/Administracion/Capacitaciones/InscriptosPartialModel/InscriptosPartial?Id=' + cursoId, function () {
// I have some UI events here, ommiting them for simplicity
}
在您的RegisteredUsers.cshtml中,它将转到OnGet(int Id, string sortOrder)
,并且由于NameSort
是""
,所以NameSort
将被设置为name_desc
。
然后我试着用
<a asp-route-Id="@Model.CursoId" asp-route-sortOrder="@Model.NameSort">
要将Id和sortOrder传递给OnGet(int Id, string sortOrder)
,我可以在OnGet(int Id, string sortOrder)
.Since sortOrder中获得Id和sortOrder的值,而不是""
,因此这次"NameSort“将被设置为""
和NameSort = String.IsNullOrEmpty(sortOrder) ? "name_desc" : "";
。
所以您的sortOrder
是空的,因为它是在您将sortOrder
(非null)传递给OnGet
,然后OnGet
将sortOrder
设置为""
之后。
https://stackoverflow.com/questions/71224484
复制相似问题