2009-08-31 7 views
1

J'ai une vue pour créer un client qui contient de nombreuses zones de texte. Une fois que l'utilisateur a quitté chaque zone de texte, je souhaite utiliser JQuery pour appeler une méthode Controller qui va vérifier la base de données et rechercher les correspondances possibles. Le contrôleur enverra alors du contenu et jQuery utilisera dynamiquement les correspondances possibles. à ce que Stack Overflow fait quand vous entrez dans votre question et montre des questions connexes).Meilleure façon de passer plusieurs paramètres de la vue au contrôleur via JQuery

Ma question est, j'ai 15 boîtes de texte et voudrais envoyer ces données de chaque retour à chaque appel. Je voudrais éviter d'avoir ma méthode de contrôleur avec une signature comme

Public ActionResult CheckMatches(string param1, string param2... string param15) 

est-il un moyen plus facile de passer plusieurs paramers comme un objet unique, comme FormCollection?

Répondre

3

Tout ce que vous devez faire est de créer un type avec des propriétés le même nom que les noms de vos zones de texte:

public class CheckMatchesAguments 
{ 
    public string Param1 { get; set; } 
    public string Param2 { get; set; } 
    // etc. 
} 

Ensuite, changez votre action:

public ActionResult CheckMatches(CheckMatchesAguments arguments) 

C'est tout!

Soyez averti, cependant: Si CheckMatchesAguments a des propriétés non nullables (par exemple, ints), les valeurs de ces propriétés doit être dans le FormCollection ou le liant modèle par défaut ne se lient pas quoi que ce soit dans le type. Pour résoudre ce problème, incluez ces propriétés dans le formulaire ou définissez les propriétés Nullable.

0

Javascript:

var data = { foo: "fizz", bar: "buzz" }; 
$.get("urlOfAction", data, callback, "html") 

Action:

public ActionResult FooAction(MegaParameterWithLotOfStuff param) 

Et une coutume model binder:

public class MegaParameterWithLotOfStuffBinder : IModelBinder 
{ 
    public object GetValue(ControllerContext controllerContext, 
     string modelName, Type modelType, 
     ModelStateDictionary modelState) 
    { 
     var param = new MegaParameterWithLotOfStuff(); 

     param.Foo = controllerContext. 
      HttpContext.Request.Form["foo"]; 
     param.Bar = controllerContext. 
      HttpContext.Request.Form["bar"]; 

     return customer; 
    } 
} 

Global.asax:

protected void Application_Start() 
{ 
    ModelBinders.Binders[typeof(MegaParameterWithLotOfStuff)] = 
     new MegaParameterWithLotOfStuffBinder(); 
} 

ou de filtre contraignant + une action combo:

public class BindMegaParamAttribute: ActionFilterAttribute 
    { 
     public override void OnActionExecuting 
      (ActionExecutingContext filterContext) 
     { 
      var httpContext = filterContext.HttpContext; 

      var param = new MegaParameterWithLotOfStuff(); 

      param.Foo = httpContext.Request.Form["foo"]; 
      param.Bar = httpContext.Request.Form["bar"]; 

      filterContext.ActionParameters["param"] = param; 
      base.OnActionExecuted(filterContext); 
     } 
    } 

Action:

[BindMegaParam] 
public ActionResult FooAction(MegaParameterWithLotOfStuff param) 
+1

Vous n'avez pas besoin d'un classeur de modèle personnalisé pour le faire; le classeur par défaut fonctionnera. –

+0

Lors de l'utilisation de l'exemple de combinaison Binding Filter + action que vous avez donné, quel objet est [BindMegaParam] donné pour le paramètre actionResult? Comment cela sait-il utiliser le BindMegaParamAttribute? Est-ce la convention sur la configuration et il ajoute Attribute au nom de l'objet donné? – Fermin

+0

Oui, c'est. La partie "Attribute" est facultative lorsque vous appliquez un attribut. –

Questions connexes