ASP.NET - Problema ASP.NET SELECT asp-items

 
Vista:

Problema ASP.NET SELECT asp-items

Publicado por Alberto Pous (5 intervenciones) el 09/01/2024 22:25:25
Estoy creado un proyecto con Razor Pages, para añadir en una tabla un campo foreign key creo una lista para ser seleccionada con datos de la tabla en un <Select> pero no me carga los esos datos

El codigo del controlador en la pagina Create

public IActionResult OnGet()
{
IQueryable<Familia> familias = from m in _context.Familia
select m;
Familias = (IList<Familia>)familias.ToList();
IEnumerable<SelectListItem> itemsfamilias = Familias.Select(a => new SelectListItem
{
Value = a.Id.ToString(),
Text = a.Name
});
return Page();
}

si compruebo con puntos de ruptura los valores de itemsfamilias son correctos y se cargan bien pero a la hora de capturar esta información en la vista no aparee nada en el desplegable. El codigo de la vista:

<div class="form-group">
<label asp-for="Receta.FamiliaId" class="control-label"></label>
<select asp-for="Receta.FamiliaId" class="form-control" asp-items="@Model.itemsfamilias"
multiple="multiple" >
<option value="">-- Seleccionar Familia --</option>
</select>
<span asp-validation-for="Receta.FamiliaId" class="text-danger" />
</div>

donde está el error ?
Muchas Gracias
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil

Problema ASP.NET SELECT asp-items

Publicado por manuel (4 intervenciones) el 14/01/2024 19:33:59
Hola, acabo de replicar tu ejemplo y creo que no estás adjuntando la lista de 'itemsfamilias' al modelo de tipo 'Familia' por ende en la vista esta vacio y no muestra nada.

Mira, así paso mí lista de datos a la vista, similar a lo que tienes. En mi caso uso una lista de categorias con otros datos pero no hay diferencia en cuanto a lo que quiero mostrar

1
2
3
4
5
6
7
8
9
10
11
12
public IActionResult OnGet()
{
    var selectList = categoryList.Select(c => new SelectListItem()
    {
        Value = c.Id.ToString(),
        Text = c.Name
    });
 
    ViewBag.Categories = selectList;
 
    return View();
}

Luego en la vista 'OnGet' muestro él select así

1
2
3
4
5
6
7
8
9
10
11
@{
    var categories = (IEnumerable<SelectListItem>)ViewBag.Categories;
    if (categories != null)
    {
        <div class="form-group">
            <select class="form-control" asp-items="@categories" multiple="multiple">
                <option value="">--Seleccionar--</option>
            </select>
        </div>
    }
}

Y este es el resultado

SelectListItems

Fijate como te digo si estás cargando bien la lista de 'itemsfamilias' antes de ir a la vista. Deberías checkear eso justo antes de esta línea en tu controlador.

1
return Page();
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Problema ASP.NET SELECT asp-items

Publicado por Alberto Pous (5 intervenciones) el 15/01/2024 17:56:39
Hola, Gracias por tu respuesta he cambiado el código a:

public IActionResult OnGet()
{
IQueryable<Familia> familias = from m in _context.Familia
select m;
Familias = (IList<Familia>)familias.ToList();
IEnumerable<SelectListItem> itemsfamilias = Familias.Select(a => new SelectListItem
{
Value = a.Id.ToString(),
Text = a.Name
});

ViewBag.Categories = itemsfamilias;
return View();
}


Y en la Vista


@{

var familias = (IEnumerable<SelectListItem>)ViewBag.Categories;
}

<div class="form-group">
<label asp-for="Receta.FamiliaId" class="control-label"></label>
<select asp-for="Receta.FamiliaId" class="form-control" asp-items="@familias"
multiple="multiple" >
<option value="">-- Seleccionar Familia --</option>
</select>
<span asp-validation-for="Receta.FamiliaId" class="text-danger" />
</div


Pero ahora me aparecen 2 errores de compilación


Error CS0103 El nombre 'ViewBag' no existe en el contexto actual
Error CS1955 No se puede usar como método el miembro 'View' no invocable.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Problema ASP.NET SELECT asp-items

Publicado por manuel (4 intervenciones) el 16/01/2024 13:35:29
mmm.. eso esta bien raro ¿Estás trabajando sobre un proyecto MVC ASP.NET Core o sobre qué tipo de proyecto has creado tu solución? El ejemplo que te pase debería andar bien sobre un proyecto MVC ASP.NET Core y creo que tu tienes un proyecto de ese tipo por que ví en tu comentario inicial usas "IActionResult", en MVC .Net Core se usa esa interfaz en los métodos de acción a diferencia de .Net Framework (standar) que ahí se usan los "ActionResult".
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Problema ASP.NET SELECT asp-items

Publicado por Alberto Pous (5 intervenciones) el 16/01/2024 17:36:33
Hola,

Si, utilizo proyecto MVC Razor Pages VS 2022 no logro entender porque no funciona ViewBag

Gracias
Alberto
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Problema ASP.NET SELECT asp-items

Publicado por manuel (4 intervenciones) el 16/01/2024 23:32:25
mmm.. acabo de Instalarme Visual Studio 2022 Community y crearme un proyecto MVC .Net Core y replicar el código que te pase, no me dio ese error que comentas. ¿Tienes esta estructura de proyecto verdad?


EjProyectMVC

¿El controlador donde tienes el método de acción "OnGet" es algo similar a este?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.AspNetCore.Mvc.Rendering;
using System.Diagnostics;
using temp_lwp.Models;
 
namespace temp_lwp.Controllers
{
    public class HomeController : Controller
    {
        private readonly ILogger<HomeController> _logger;
 
        public HomeController(ILogger<HomeController> logger)
        {
            _logger = logger;
        }
 
        public IActionResult Index()
        {
            return View();
        }
 
        public IActionResult Privacy()
        {
            return View();
        }
 
        public IActionResult OnGet()
        {
            List<Familia> familias = new List<Familia>()
            {
                new Familia() { Id = 1, Name = "fam1" },
                new Familia() { Id = 2, Name = "fam2" },
                new Familia() { Id = 3, Name = "fam3" },
            };
 
            var selectList = familias.Select(c => new SelectListItem()
            {
                Value = c.Id.ToString(),
                Text = c.Name
            });
 
            ViewBag.Familias = selectList;
 
            return View();
        }
 
        [ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
        public IActionResult Error()
        {
            return View(new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier });
        }
    }
}

Avisame a así vemos que puede ser.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Problema ASP.NET SELECT asp-items

Publicado por manuel (4 intervenciones) el 16/01/2024 23:38:13
Mira, acá te dejo el proyecto de ejemplo que hice dónde esta el select list. Cuando ejecutes la aplicación tienes que acceder a "/Home/OnGet" para poder ver la lista. Pruebalo y me dices.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Problema ASP.NET SELECT asp-items

Publicado por Alberto Pous (5 intervenciones) el 17/01/2024 18:48:25
Hola,

No el proyecto mio es en Razor Pages y según he leido ViewBag no se puede utilizar en Razor Pages la estructura no es la misma en lugar de Vistas están las Pages

public IActionResult OnGet()
{
IQueryable<Familia> familias = from m in _context.Familia
select m;
Familias = (IList<Familia>)familias.ToList();
IEnumerable<SelectListItem> itemsfamilias = Familias.Select(a => new SelectListItem
{
Value = a.Id.ToString(),
Text = a.Name
});

AQUÍ TODO CORRECTO itemsfamilias tiene los items bien cargados
return Page();
}

El problema lo tengo en la vista de la Page, parece que no recupera los datos de itemsfamilias
<div class="form-group">
<label asp-for="Receta.FamiliaId" class="control-label"></label>
<select asp-for="Receta.FamiliaId" class="form-control" asp-items="@Model.itemsfamilias"
multiple="multiple" >
<option value="">-- Seleccionar Familia --</option>
</select>
<span asp-validation-for="Receta.FamiliaId" class="text-danger" />
</div>
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Problema ASP.NET SELECT asp-items

Publicado por Alberto Pous (5 intervenciones) el 19/01/2024 11:21:29
SOLUCIONADO

En Razor Pages, las variables del Modelo son accesibles desde la vista, el problema estaba en la creación de la variable

Solución:

public List<SelectListItem> itemsfamilias { get; set; } = default!;

public IActionResult OnGet()
{
IQueryable<Familia> familias = from m in _context.Familia
select m;
itemsfamilias = familias.Select(a => new SelectListItem
{
Value = a.Id.ToString(),
Text = a.Name
}).ToList();

return Page();
}

y en la vista (page)

<div class="form-group">
<label asp-for="Receta.FamiliaId" class="control-label"></label>
<select asp-for="Receta.FamiliaId" class="form-control" asp-items="@Model.itemsfamilias"> ACCESO DIRECTO A VARIABLE DEL MODELO
<option value="">-- Seleccionar Familia --</option>
</select>
<span asp-validation-for="Receta.FamiliaId" class="text-danger" />
</div>
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar