2009-08-18 5 views
1

Dans mon application Web, j'ai un formulaire généré dynamiquement que j'utilise pour créer un objet JSON pour revenir à une action. Comme on le voit ici:Comment envoyer des objets JSON profonds à une action?

function getConfigItemWithValidators() { 
     log.info("getConfigItemWithValidators()"); 
     var oConfigItem = { 
      "Name": $("#txtName").html(), 
      "InputFileCellIndex": $("#inpFieldIndex").val(), 
      "Validators": new Array() }; 

     for (var i = 0; true; i++) { 
      var oHiddenValidatorName = $("[name=hidVld"+i+"]"); 
      var oHiddenValidatorVal = $("[name=txtVld"+i+"]"); 
      if ($("[name=hidVld" + i + "]").length > 0) { 
       var oValidator = { 
        "ValidationType": oHiddenValidatorName.val(), 
        "ValidationValue": oHiddenValidatorVal.val() }; 
       oConfigItem.Validators.push(oValidator); 
      } 
      else 
       break; 
     } 
     return oConfigItem 
    } 

    function saveConfigItemChanges() { 
     log.info("saveConfigItemChanges()"); 
     var oConfigItem = getConfigItemWithValidators(); 
     $("#divRulesContainer").hide("normal"); 
     $.getJSON("PutValidationRules", oConfigItem, 
        saveConfigItemChangesCallback); 
    } 

Dans mon action, alors que le débogage, je remarque que model.Validators est vide:

[AcceptVerbs(HttpVerbs.Get)] 
    public JsonResult PutValidationRules(ConfigItem model) 
    { 
     // model.Validators is empty 
     return Json(true); 
    } 

Voici le code à ConfigItem:

public class ConfigItem 
{ 
    public string Name { get; set; } 
    public int InputFileCellIndex { get; set; } 

    private IList<Validator> _validators = new List<Validator>(); 
    public IList<Validator> Validators 
    { 
     get 
     { 
      return _validators; 
     } 
    } 

    public void AddValidator(Validator aValidator) 
    { 
     aValidator.ConfigItem = this; 
     _validators.Add(aValidator); 
    } 
} 

est-il que dois-je faire pour que ConfigItem.Validators soit compilé pour mes requêtes JSON?

Répondre

1

Il est vide car le classeur par défaut ne fonctionne pas très bien pour les tableaux. Vous devrez implémenter un custombinder. Vous pouvez voir here un exemple de reliures personnalisées

+0

Au lieu d'écrire un classeur personnalisé, j'ai fait ma forme pour accueillir le classeur intégré. – JMP

+0

Bien sûr, il est toujours un choix, mais les noms des attributs peuvent être modifiés, puis vous devez faire des changements similaires dans les vues et peut-être même dans le découpage HTML.Il ajoute à mon avis inutile quantité de travail. –

Questions connexes