2009-12-03 18 views
4

Je travaille avec un modèle qui doit circuler à travers une série de contrôleurs et de vues en cours de manipulation (en le chargeant uniquement sur le premier contrôleur). Existe-t-il un moyen de conserver le modèle de la vue à un contrôleur et ainsi de suite?MVC - Comment passer le modèle de la vue au contrôleur

Voici mon code.

Modèle:

public class ROWModel 
{ 
    #region Properties 
    //Request 
    public List<TBLRETURNABLEITEMS> TBLRETURNABLEITEMS { get; set; } 
    //public List<ReturnReasons> ReturnReasons { get; set; } 

    public int Order_No { get; set; } 
    public string First_Name {get; set; } 
    public string Last_Name {get; set; } 
    public string Company { get; set; } 
    public string Address_1 { get; set; } 
    public string Address_2 { get; set; } 
    public string City { get; set; } 
    public string State { get; set; } 
    public string Postal_Code { get; set; } 
    public string Email { get; set; } 
    public string Phone { get; set; } 
    public string CustomerCode {get; set; } 
    public string TerritoryCode {get; set; } 


    //Post 

    #endregion 

    #region Constructor 
    public ROWModel() 
    { } 
    #endregion 
} 

public class ReturnableItems : IComparable<ReturnableItems> 
{ 
    private int _id; 
    private decimal _ordered; 
    private decimal _shipped; 

    public int Id 
    { 
     get { return _id; } 
     set { _id = value; } 
    } 

    public decimal Ordered 
    { 
     get { return _ordered; } 
     set { _ordered = value; } 
    } 

    public decimal Shipped 
    { 
     get { return _shipped; } 
     set { _shipped = value; } 
    } 

}

Après avoir rempli le modèle et l'envoyer à la vue tout est affiché à l'aide du modèle tel qu'il devrait être. Je pense coller le modèle comme tant sur la balise form:

<% using (Html.BeginForm("Items", "ROW", Model)) 

Voici les articles post action du contrôleur ROW:

[ActionName("Items"), AcceptVerbs(HttpVerbs.Post)] 
    public ActionResult Items(ROWModel model, FormCollection collection) 

problème est le modèle ne renvoie pas la liste des TBLRETURNABLEITEMS i peuplée avec initialement. Il garde les autres propriétés que j'ai peuplées mais pas la liste. Comment puis-je conserver les données de ce modèle sans avoir à le recharger sur chaque contrôleur si je le souhaite.

+2

Quel MVC? ASP.NET MVC? –

+0

oui ASP.NET MVC. –

+1

Ne pouvez-vous pas simplement ajouter le type de modèle de vue en tant qu'argument sur une méthode Action? public ActionResult ActionOnSecondController (modèle MyViewModel) {...} – mxmissile

Répondre

9

Je pense que vous pouvez utiliser TempData pour cela.

donc quelque chose comme ceci:

[AcceptVerbs(HttpVerbs.Get)] 
    public ActionResult TestA() 
    { 
     MyModel model = new MyModel(); 
     model.Something = "Test"; 
     return View(model); 
    } 

    [AcceptVerbs(HttpVerbs.Post)] 
    public ActionResult TestA(MyModel model) 
    { 
     TempData["MyModel"] = model; 
     return RedirectToAction("TestB"); 
    } 

    [AcceptVerbs(HttpVerbs.Get)] 
    public ActionResult TestB() 
    { 
     MyModel myModel = (MyModel)TempData["MyModel"]; 
     return View(myModel); 
    } 
+1

Que faire si l'utilisateur appuie sur F5? – queen3

+1

Vous avez été le premier à répondre correctement. TempData est une solution précise pour ce problème. Après un peu plus de recherche cependant, probablement pas une bonne idée pour ma situation en raison de la concurrence db et de notre site assis sur un serveur de charge équilibrée. –

3

NerdDinner Étape 6: ViewData et ViewModel
http://nerddinnerbook.s3.amazonaws.com/Part6.htm

+0

Merci pour votre réponse, mais je ne veux pas recharger complètement le modèle sur chaque action du contrôleur. Juste l'initiale. Ne vois rien dans ce lien détaillant cela. –

+0

OK. Mais comment gérez-vous les problèmes de concurrence? Que se passe-t-il si quelqu'un modifie les données entre vos pages vues? –

+0

C'est un bon point. J'imagine que j'ai l'impression d'être sur la route que je ne voulais pas avoir à descendre et que c'est la base de données et le rechargement sur chaque action du contrôleur. –

-1

Obtenir un modèle (tout modèle) du point de vue du contrôleur est assez simple.

D'autres ici ont couvert la partie où vous prenez un objet modèle en tant que param. Ce que vous semblez manquer, c'est la liaison de la liste, qui se base sur les noms des éléments de formulaire dans la vue. Fondamentalement, ils doivent ressembler à des éléments de liste C# en tant que chaînes. Alors, ne sachant pas l'une des propriétés de vos éléments de la liste, quelque chose comme:

<%= Html.TextBox("model.TBLRETURNABLEITEMS[0].ItemId") %> 

De toute évidence, c'est juste une chaîne, de sorte que vous pouvez construire dans une boucle pour faire de nombreuses lignes de retournables.

+0

donné mon code ci-dessus comment voulez-vous l'incorporer. Je rencontre toujours des difficultés pour soumettre le modèle et afficher des éléments dans TBLRETURNABLEITEMS. Bien que je ne puisse pas descendre cette route pour des problèmes de concurrence de base de données ceci répondrait toujours à ma question initiale. –

1

Vous pouvez utiliser la session pour ce type de problèmes. ou vous pouvez utiliser tempdata si les messages sont séquentiels. et de récupérer à chaque fois à partir de DB fonctionne si vous exécutez l'application dans les réseaux intranet.

-1

Je pense que dans MVC ainsi session est une option pratique au lieu de firefighting avec le retour à l'action avec Viewmodel.

+0

S'il vous plaît expliquer votre réponse. – neophyte

Questions connexes