2010-07-13 6 views
2

J'ai un contrôleur appelé ProductController. Le code du contrôleur est ci-dessous:ASP.NET MVC 2.0 - données dans ViewModel perdues après publication

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.Mvc; 
using Services.Abstract; 
using Web.Models; 
using Ninject; 
using Services.Entities; 

namespace Web.Controllers 
{ 
    public class ProductController : Controller 
    { 

     IProductRepository productRepository; 

     public ProductController(IProductRepository products) 
     { 
      productRepository = products; 
     } 


     [HttpGet] 
     public ActionResult Create() { 

      Product p = new Product { 
       Id = 5 
      }; 

      string theTitle = "The Title"; 

      var viewModel = new ProductViewModel { 
       Product = p, 
       TheTitle = theTitle 
      }; 

      return View(viewModel); 

     } 

     [HttpPost] 
     public ActionResult Create(ProductViewModel pvm) { 

      if (ModelState.IsValid) { 
       int result = productRepository.SaveProduct(pvm.Product); 
       return Content(result.ToString()); 
      } 
      else { 
       return View(pvm); 
      } 

     } 

    } 
} 

J'utilise le modèle ViewModel d'envoyer différents bits d'information à la vue. Par exemple, j'envoie un produit avec un Id par défaut fixé à 5, et je mets également une propriété title [A part: ce n'est pas un code de production - juste des données de test :-)]

Tout va bien jusqu'ici. Lorsque/Product/Create est appelé pour la première fois, ma propriété Title est affichée dans la vue et l'ID de produit par défaut est 5. Toutefois, lorsque je publie le formulaire, seules les informations sur le produit sont conservées. Si ModelState n'est pas valide, j'affiche de nouveau la vue à l'utilisateur. Cependant, cette fois-ci, le titre ne s'affiche pas (il est défini sur null). Le produit s'affiche comme prévu cependant.

Si possible, je souhaite renvoyer le titre d'origine à la vue lorsque ModelState n'est pas valide. Est-il possible de le faire sans utiliser Session, ViewData et TempData?

Cordialement, et merci à l'avance

+0

Est-ce que vous définissez le titre sur le formulaire ... lorsque vous publiez ... si vous n'êtes pas ... essayez de le redéfinir sur quelque chose par défaut dans la vue avant de le poster ... – Vishal

+0

Non. Ne pas essayer de définir le titre sur le formulaire. Mon exemple ci-dessus était probablement un peu stupide, en ce sens que vous n'enverriez probablement jamais quelque chose comme un titre à une vue via un ViewModel. Cependant, je peux voir une situation où je devrai passer d'autres choses au ViewModel qui devront être conservées entre les publications. –

+0

Hmm..tout ce que je peux penser à des champs cachés pour conserver des infos ... mais j'ai fait poster des viewmodels d'une action à l'autre ... ça devrait marcher à moins que ... peut-être quelques problèmes de noms ... mvc est assez bizarre parfois ... peut-être inclure ce que vous essayez de faire sur la vue? – Vishal

Répondre

1

Si je vous comprends bien, la réponse est « non ».

Si la propriété ProductViewModel.TheTitle ne fait pas partie des données de formulaire publiées dans la méthode Create POST, vous devrez la recréer d'une manière ou d'une autre. Vous êtes sur la bonne voie avec les façons possibles de maintenir cette valeur sur plusieurs demandes, mais je vous demanderais s'il est vraiment nécessaire d'y aller en fin de compte. À mon avis, si la façon dont vous récupérez la propriété Title dans la méthode Create GET est assez bonne pour ces requêtes, il est tout aussi bon de la recréer de la même manière dans les requêtes POST. Un POST va généralement prendre plus de ressources et de temps pour traiter (valider, enregistrer des données, etc.) tel quel, de sorte que vous vous exposez à des dépendances et des vulnérabilités supplémentaires pour une optimisation triviale probable. Cela dit, je suis sûr qu'il y a beaucoup de scénarios où vous approchez serait justifié. Dans votre exemple, comme la propriété Title n'est pas utilisée pour enregistrer le produit et peut être ignorée, si vous voulez la conserver sur ces pages sans la recréer, le plus simple est de l'inclure dans un champ de formulaire caché de sorte que votre classeur le ramasse en plus du produit. Sachez simplement que les utilisateurs finaux peuvent modifier cette valeur s'ils manipulent la charge utile du formulaire.

Questions connexes