web-dev-qa-db-fra.com

Comment passer des objets d'une page à une autre sur ASP.Net Core avec des pages de rasoir?

Je développe une application web utilisant Asp.net core 2.0 avec des pages de rasoir. Je crée un objet avec des données et je veux envoyer cet objet vers une autre page.

En fait, je fais ça:

var customObject = new{
   //some values
};
return RedirectToPage("NewPage", customObject);

Je vois que l'url a les valeurs de l'objet que j'envoie, mais je ne trouve pas comment prendre ces valeurs (dans l'instance NewPage).

Quelqu'un peut-il savoir comment partager des objets entre les pages de rasoir? Est-ce la bonne façon d'y parvenir? ou Y a-t-il une autre meilleure façon?

Merci d'avance

11
gsaldana

Je ne sais pas si cela pourrait vous aider ou si c'est une bonne pratique pour les versions MVVM comme Razor, mais dans les projets API ASP.NET Core j'utilise souvent des services DI globaux personnalisés, comme

public void ConfigureServices(IServiceCollection services)
{
    ...

    services.AddSingleton<IMyService, MyService>();

    ...

     services.AddMvc();
}

Vous pouvez échanger des données entre votre IndexModel et un CustomModel par exemple. en le définissant comme

public class CustomModel : PageModel
{
   public IMyService _myService;

   public CustomModel(IMyService myService)
   {
       _myService = myService;
   }

   public async Task<IActionResult> OnPostAsync(...)
   {
        ...

        _myService.SetDataOrSometing(...);

        ...

        return RedirectToPage();
   }
}

et le récupérer comme

public class IndexModel : PageModel
{
    public IMyService _myService;

    public IndexModel(IMyService myService)
    {
        _myService = myService;
    }

    public void OnGet()
    {
        var data = _myService.GetDataOrSomething();
    }
}

De là, vous pouvez également utiliser une ObserveableCollection et enregistrer des événements pour obtenir les mises à jour de vos PageModels.

À mon humble avis, c'est un moyen de passer des objets d'une page à l'autre avec une séparation nette des préoccupations.

1
marrrschine

Vous pouvez passer des paramètres aux gestionnaires spécifiés dans la classe de modèle de page, comme ceci:

return RedirectToPage("Orders", "SingleOrder", new {orderId = order.Id});

Où la méthode de classe de modèle de page a cette signature:

public void OnGetSingleOrder(int orderId)

Si vous passez un objet, vous pouvez le passer directement, mais d'après mon expérience, aucun objet enfant n'est rempli.

27
hillstuk

La clé ici est que vous devez passer un objet anonyme dont les noms de propriété correspondent aux contraintes de routage définies dans la page Razor.

Par exemple, si vous définissez une contrainte de routage id (facultative) dans la page Razor:

@page "{id?}"

Pour rediriger vers cette vue en passant un id spécifique, faites simplement:

return RedirectToPage("PageName", new { id = 3 });

Si vous venez de rediriger vers la page actuelle (mais en passant un id) spécifique, faites simplement:

return RedirectToPage(new { id = 3 });

Si vous passez simplement le numéro sans l'objet anonyme, cela ne fonctionnera pas.

4
Eduardo Hernández

Passer un objet d'une page à une autre via Anchor Tag Helper.

  1. Classe de modèle.

    public class Car
    {
        public int ID { get; set; }
        public string Name { get; set; }
        public string Model { get; set; }
        public string Description { get; set; }
    }
    
  2. Voitures - 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" }
        };
    }
    
  3. Cars - RazorPage (( source du pass-object ) -> afficher tous les éléments (dans notre cas, les voitures) de la liste de "CarsModel". Dans l'attribut 'Anchor Tag Helper', utilisez l'attribut 'asp-all-route-data', qui est initialisé avec le nom du dictionnaire sous forme de chaîne (dans notre cas, '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>
    
  4. Détails - PageModel (( destination de l'objet-passe ).

    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();
        }
    }
    
  5. Détails - 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>
    
3
Ted