Tengo una aplicación que se escribe en la parte superior del marco 5 / .NET 5 / .NET. Tengo la necesidad de crear una ruta flexible que vincule a varios parámetros de cadena.

Por ejemplo, la ruta se vería así.

/homes-for-sale-in-los-angeles-100/0-5000_price/condo,apartment_type/0-5_beds/0-4_baths/2_page

En la URL anterior, la única parte requerida será /homes-for-sale-in-los-angeles-100. los-angeles es el nombre de la ciudad y 100 es la identificación. El resto son solo parámetros. El significado de 0-5000_price quiero unir el valor 0-5000 a un parámetro llamado price.

No siempre se proporcionan todos los parámetros. Aquí hay algunas formas diferentes de la misma ruta.

/homes-for-sale-in-los-angeles-100/condo,apartment_type
/homes-for-sale-in-los-angeles-100/0-5000_price/10_page
/homes-for-sale-in-los-angeles-100/condo_type/0-5000_price/2_page

Esto es lo que he hecho

[Route("/homes-for-sale-in-{city}-{id:int}.{filter?}/{page:int?}", Name = "HomesForSaleByCity")]
public async Task<IActionResult> Display(SearchViewModel viewModel)
{
    return View();
}

public class SearchViewModel 
{
    [Required]
    public int? Id { get; set; }
    
    public string City { get; set; }

    public string Price { get; set; }

    public string Type { get; set; }

    public string Beds { get; set; }

    public string Baths { get; set; }

    public int Page { get; set; }
}

¿Cómo puedo crear una ruta que permitiría múltiples parámetros opcionales y los enlazarlos correctamente?

2
Jay 29 may. 2021 a las 21:46

1 respuesta

La mejor respuesta

El uso de una definición de ruta como esta le hará capturar todas esas rutas que proporcionó:

[Route("homes-for-sale-in-{city}-{id}/{**catchAll}")]
[HttpGet]
public async Task<IActionResult> City(string city, string id, string catchAll)
{
  // Here you will parse the catchAll and extract the parameters        
  await Task.Delay(100);
  return this.Ok(catchAll);
}

También tenga en cuenta que el parámetro catchAll no se puede hacer opcional. Por lo que una solicitud como /homes-for-sale-in-los-angeles-100/ resultará en 404.

1
Eldar 30 may. 2021 a las 11:01