2009-10-25 3 views
3

Je suis nouveau sur ASP.NET MVC, donc cela pourrait avoir une réponse évidente. En ce moment, je forme à mon avis avec beaucoup de contrôles d'entrée, donc j'avoir une action qui ressemble à ceci:Utilisation de paramètres nommés en tant qu'entrée de contrôleur par rapport à FormCollection

public ActionResult MyAction(string formItemOne, int? formItemTwo, etc...) 

Il a comme une douzaine de paramètres, ce qui est assez laid. J'essaye de le changer à ceci:

public ActionResult MyAction(FormCollection formItems) 

et alors analysez les articles dynamiquement. Mais quand je change en FormCollection, les éléments de formulaire ne se souviennent plus "automagiquement" de leurs valeurs par le biais des publications. Pourquoi changer à un FormCollection changer ce comportement? Quelque chose de simple que je peux faire pour le faire fonctionner automagically encore?

Merci pour l'aide,

~ Justin

Répondre

4

Une autre solution consiste à utiliser des modèles au lieu de manipuler les valeurs brutes. Comme ceci:

class MyModel 
{ 
    public string ItemOne { get; set; } 
    public int? ItemTwo { get; set; } 
} 

Ensuite, utilisez ce code:

public ActionResult MyAction(MyModel model) 
{ 
    // Do things with model. 

    return this.View(model); 
} 

À votre avis:

<%@ Page Inherits="System.Web.Mvc.ViewPage<MyModel>" %> 
<%= Html.TextBox("ItemOne", Model.ItemOne) %> 
<%= Html.TextBox("ItemTwo", Model.ItemTwo) %> 
0

Peut-être parce qu'ils ne sont pas comme par magie insérés dans le dictionnaire ModelState plus. Essayez de les insérer là.

Si vous utilisez UpdateModel() ou TryUpdateModel(), je pense que les valeurs vont être conservées.

1

Pour remplacer votre grande liste de paramètres avec un seul, utilisez un view model. Si après le POST vous retournez ce modèle à votre vue, votre vue se souviendra des valeurs affichées. Un modèle de vue est simplement une classe avec vos paramètres d'action en tant que propriétés publiques. Par exemple, vous pourriez faire quelque chose comme ça, en remplaçant:

public ActionResult MyAction(string formItemOne, int? formItemTwo, etc...) 

avec

public ActionResult MyAction(FormItems formItems) 
{ 
    //your code... 
    return View(formItems); 
} 

où FormItem est

public class FormItems 
{ 
    public property string formItemOne {get; set;} 
    public property int? formItemTwo {get; set;} 
} 

Vous pouvez voir un exemple complet dans le poste ASP.NET MVC Tip #50 – Create View Models de Stephen Walter.

Questions connexes