2 votes

NET MVC 4 - Meilleures pratiques pour conserver l'état d'une liste d'objets sélectionnés

Cela devrait être facile, mais sans ViewState, je ne sais pas quoi faire (j'ai été bercé par les WebForms pendant trop longtemps, je sais !)

Mon scénario :

Voir

 @foreach (var product in Model.Products)
{
    <tr>
       <td>@Html.ActionLink("Compare", "Compare", new { id = product.ProductId })</td>
    </tr>
}

Contrôleur

public ActionResult Compare(int id = 0)
{
        var product = SelectProduct(id); // selects the product from a list of cached products.

        if (product != null)
        {
           // _productDetails is a Model specifically for my View.
            _productDetails.ComparedProducts.Add(product);
        }

        return View("Index", _productDetails);
}

Bien entendu, lorsque vous cliquez sur "Comparer" pour chaque article, celui-ci est ajouté à la liste des produits comparés. Mais comme il n'y a pas de ViewState, cette liste sera effacée à chaque rafraîchissement de la page et perdra le dernier produit. Je veux que les produits soient conservés dans cette liste ComparedProducts, mais comment ?

Je suppose qu'ils doivent être ajoutés à la chaîne de requête, donc /Carousel/Compare/?id=2122,1221,1331,1333 etc. Si c'est le cas, comment est-ce possible ?

Merci d'avance.

Mise à jour

Si je a fait Je souhaite utiliser la chaîne de requête, comment faire ?

J'ai essayé :

<td>@Html.ActionLink("Compare", "Compare", new { id = product.ProductId, compared = Model.ComparedProducts.Select(a => a.ProductId) })</td>

Mais cela fait ressortir :

compared=System.Linq.Enumerable%2BWhereSelectListIterator`2[Product%2CSystem.Int32]

Ce à quoi je m'attendais vraiment. Je suppose que je devrais créer une autre propriété ViewModel et simplement y stocker les identifiants comparés pour ne pas avoir trop de logique commerciale dans ma vue ?

1voto

Jorge Alvarado Points 1468

+1 pour votre relation avec les webforms :) Je pense qu'à partir de maintenant, vous pouvez commencer à conserver l'état de la manière que vous connaissez déjà des formulaires web, comme l'état de la session : http://msdn.microsoft.com/en-us/library/ms178581(v=vs.100).aspx

Vous avez également raison en ce qui concerne la chaîne de requête, après tout, si vous voulez garder les choses simples, il est préférable d'utiliser les méthodes les plus simples, par exemple :

<url>?reference=123&compare=456

EXEMPLE

vous avez besoin de la première action comme HttpGet et maintenant celle-ci comme httpPOST

[HttpPost]
public ActionResult Compare(myModel model)
{

    var product = SelectProduct(model.reference); // selects the product from a list of cached products.

    if (product != null)
    {
       // _productDetails is a Model specifically for my View.
       // you can always update the model you got in the first place and send it back
        model.ComparedProducts.Add(product); //
    }
return View("Index", model);

Votre vue doit réagir en fonction des propriétés vides à afficher

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X