Question

Situation: Dans un logiciel de gestion de projet écrit en asp.net J'ai créer la page de projet (fonctionne bien). Je dois ajouter à cela la possibilité d'ajouter des tâches à partir d'une liste de modèles à ce projet pré-création, mais la liste des tâches disponibles dépend de certaines valeurs assis sous la forme de créer.

Ma solution abstraite est la suivante:

  • J'ai un « Créer » vue et une « Tâches » Ajouter View - à la fois fortement typé à un viewmodel composite défini dans le contrôleur
  • Mon Créer méthode vérifie quel bouton a été utilisé pour appeler - si le bouton était « Ajouter des tâches », il rend alors la vue AddTasks, en passant le modèle de la vue de créer, à nouveau dans le même contrôleur.
  • Les AddTasks Voir les messages à la vue Créer avec l'un des deux boutons, on charge la vue et l'autre provoque une DB réellement sauver.

Mon problème est le suivant:

  • Les différentes vues utilisent des propriétés différentes du même modèle, mais en passant ce modèle entre eux, les données sont remis à zéro (en tout cas de rechargement ou enregistrer).
  • Je devine ce qui se passe de l'auto liaison de données -. Si je pensais que les champs ne sont pas présents sur le formulaire ne pas écraser les données du modèle existant transmis
  • Il n'y a guère de code dans le contrôleur manipulant le modèle à l'heure actuelle - Il ne se passe d'une vue à dans ces cas.

Voici le code du contrôleur:

    // POST: /Project/Create/<viewModel>
    [Authorize, AcceptVerbs(HttpVerbs.Post)]
    public ActionResult Create([Bind(Exclude = "Id,id")] ProjectViewModel model)
    {
        if (model.SubmitValue == "Create")
        {
            try
            {
                model.Project.Id = Guid.NewGuid();
                model.Save(this.User.Identity.Name);
                return this.RedirectToAction("Details", new {id = model.Project.Id});
            }
            catch (Exception e)
            {
                this.ModelState.AddModelError(e.ToString(), e.ToString());
            }
            return View(model);
        }

        if(model.SubmitValue == "AddTasks")
        {
            return this.View("AddTasks",model);
        }

        return this.View(model);

    }


    //POST: /Project/AddTasks/ + model
    [Authorize, AcceptVerbs(HttpVerbs.Post)]
    public ActionResult AddTasks([Bind(Include = SelectedCarrierTasks")]ProjectViewModel model)
    {
        return View(model);
    }

La question est: Comment puis-je maintenir l'état du modèle à travers ces points de vue jusqu'à ce qu'il a finalement enregistrer

Je préférerais éviter tout hackish (TempData) ou des solutions dépendantes JS, mais je ne suis pas fermé à ces si elles sont vraiment la meilleure solution.

Merci, Adam Tolley

Était-ce utile?

La solution

Je ne peux pas commenter sur d'autres peuples questions à l'heure actuelle, mais la seule option est la session si vous souhaitez conserver un état des objets lors de requêtes Web, ou la sérialisation et le placer dans un champ caché.

Ou une dernière option serait de changer la façon dont vos pages fonctionnent de sorte que vous pouvez enregistrer l'objet après chaque demande ...

Si votre utilisation de NHibernate alors vous voudrez peut-être se pencher sur le modèle de conversations, mais cela sauve juste essentiellement la session NHibernate dans la session asp.net de toute façon ...

Autres conseils

Une solution simple consiste à persister l'objet ViewModel dans une variable de session et de lier la vue de cette source.I ts certainement pas la solution la plus élégante. Une autre option, et un probablement moins élégant est persister ces données de modèle dans la base de données, avec un certain drapeau temporaire / non enregistré.

Le problème est que lorsque vous affichez les tâches add voir que vous ne fournissez pas les champs pour votre objet donc le ModelState « Projet » perd les données relatives au projet, vous devez fournir ces champs pour vous assurer que vous n'êtes pas perdre ces données.

Vous n'avez pas besoin d'afficher ces champs peuvent être de type caché et ils préserver la valeur. Assurez-vous que si vous lie à un modèle de vue que vous devez nommer ces champs correctement comme celui-ci Model.Project.Property.

Peut-être que je suis en train de résoudre le mauvais problème (ala Bruce Eckel). Je vais essayer de passer à une structure qui a besoin de ce genre de limite floue moins. Je ne veux pas adopter un paradigme REPOS à la corne chaussure dans une application stateful.

Peut-être ces contrôles appartiennent à la même page, et je peux utiliser une certaine bonté JQuery pour mettre dans un volet d'onglet pour les yeux sur la facilité.

Merci à tous ceux qui ont répondu, j'ai trouvé chaque utile et essayer de se rappeler les haut-voter dès que j'ai un peu plus représentant.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top