Solución:
Puede pasar parámetros a controladores especificados en la clase de modelo de página, así:
return RedirectToPage("Orders", "SingleOrder", new {orderId = order.Id});
Donde el método de clase de modelo de página tiene esta firma:
public void OnGetSingleOrder(int orderId)
Si está pasando un objeto, puede pasar el objeto directamente, pero en mi experiencia, los objetos secundarios no se rellenan.
La clave aquí es que debe pasar un objeto anónimo cuyos nombres de propiedad coincidan con las restricciones de enrutamiento definidas en la página de Razor.
Por ejemplo, si define un id
(opcional) restricción de enrutamiento en la página de Razor:
@page "{id?}"
Para redirigir a esa vista pasando un específico id
, solo haz:
return RedirectToPage("PageName", new { id = 3 });
Si solo desea redirigir a la página actual (pero pasando un id
), solo haz:
return RedirectToPage(new { id = 3 });
Si simplemente pasa el número sin el objeto anónimo, no funcionará.
Pase el objeto de una página a otra a través de Anchor Tag Helper.
-
Clase modelo.
public class Car { public int ID { get; set; } public string Name { get; set; } public string Model { get; set; } public string Description { get; set; } }
-
Coches – PageModel.
public class CarsModel : PageModel { public List<Car> Cars { get; private set; } = new List<Car> { new Car{ ID = 1, Name = "Car1", Model = "M1", Description = "Some description" }, new Car{ ID = 2, Name = "Car2", Model = "M2", Description = "Some description" }, new Car{ ID = 3, Name = "Car3", Model = "M3", Description = "Some description" }, new Car{ ID = 4, Name = "Car4", Model = "M4", Description = "Some description" } }; }
-
Coches – RazorPage (fuente del objeto de paso) -> mostrar todos los elementos (en nuestro caso coches) de la lista de ‘CarsModel’. En ‘Anchor Tag Helper’ use el atributo ‘asp-all-route-data’, que se inicializa con el nombre del diccionario como cadena (en nuestro caso, ‘dictCars’).
@page @using Newtonsoft.Json @model CarsModel @{ ViewData["Title"] = "Cars"; } <table> <thead> <tr> <th> @Html.DisplayNameFor(model => model.Cars[0].Name) </th> <th> @Html.DisplayNameFor(model => model.Cars[0].Model) </th> <th></th> </tr> </thead> <tbody> @foreach (var car in Model.Cars) { Dictionary<string, string> dictCars = new Dictionary<string, string> { { "passedObject", JsonConvert.SerializeObject(car) } }; <tr> <td> @Html.DisplayFor(modelItem => car.Name) </td> <td> @Html.DisplayFor(modelItem => car.Model) </td> <td> <a asp-page="./Details" asp-all-route-data="dictCars">Details</a> </td> </tr> } </tbody> </table>
-
Detalles – PageModel (destino del objeto de paso).
public class DetailsModel : PageModel { public Car Car { get; set; } public IActionResult OnGet(string passedObject) { Car = JsonConvert.DeserializeObject<Car>(passedObject); if (Car == null) { return NotFound(); } return Page(); } }
-
Detalles: RazorPage.
@page @model DetailsModel @{ ViewData["Title"] = "Car Details"; } <h2>Details</h2> <div> <h4>Car</h4> <hr /> <dl class="dl-horizontal"> <dt> @Html.DisplayNameFor(model => model.Car.Name) </dt> <dd> @Html.DisplayFor(model => model.Car.Name) </dd> <dt> @Html.DisplayNameFor(model => model.Car.Model) </dt> <dd> @Html.DisplayFor(model => model.Car.Model) </dd> <dt> @Html.DisplayNameFor(model => model.Car.Description) </dt> <dd> @Html.DisplayFor(model => model.Car.Description) </dd> </dl> </div>