premier téléchargement de code JavaScript, JSON2.js, cela nous aidera à sérialiser l'objet dans une chaîne.
Dans mon exemple, je signale les lignes d'une jqGrid via Ajax:
var commissions = new Array();
// Do several row data and do some push. In this example is just one push.
var rowData = $(GRID_AGENTS).getRowData(ids[i]);
commissions.push(rowData);
$.ajax({
type: "POST",
traditional: true,
url: '<%= Url.Content("~/") %>' + AREA + CONTROLLER + 'SubmitCommissions',
async: true,
data: JSON.stringify(commissions),
dataType: "json",
contentType: 'application/json; charset=utf-8',
success: function (data) {
if (data.Result) {
jQuery(GRID_AGENTS).trigger('reloadGrid');
}
else {
jAlert("A problem ocurred during updating", "Commissions Report");
}
}
});
maintenant sur le contrôleur:
[HttpPost]
[JsonFilter(Param = "commissions", JsonDataType = typeof(List<CommissionsJs>))]
public ActionResult SubmitCommissions(List<CommissionsJs> commissions)
{
var result = dosomething(commissions);
var jsonData = new
{
Result = true,
Message = "Success"
};
if (result < 1)
{
jsonData = new
{
Result = false,
Message = "Problem"
};
}
return Json(jsonData);
}
Créer une classe JsonFilter (grâce à la référence JSC).
public class JsonFilter : ActionFilterAttribute
{
public string Param { get; set; }
public Type JsonDataType { get; set; }
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
if (filterContext.HttpContext.Request.ContentType.Contains("application/json"))
{
string inputContent;
using (var sr = new StreamReader(filterContext.HttpContext.Request.InputStream))
{
inputContent = sr.ReadToEnd();
}
var result = JsonConvert.DeserializeObject(inputContent, JsonDataType);
filterContext.ActionParameters[Param] = result;
}
}
}
Créer une autre classe de sorte que le filtre peut analyser la chaîne JSON à l'objet manipulable réelle: Cette comissionsJS de classe sont toutes les lignes de mon jqGrid.
public class CommissionsJs
{
public string Amount { get; set; }
public string CheckNumber { get; set; }
public string Contract { get; set; }
public string DatePayed { get; set; }
public string DealerName { get; set; }
public string ID { get; set; }
public string IdAgentPayment { get; set; }
public string Notes { get; set; }
public string PaymentMethodName { get; set; }
public string RowNumber { get; set; }
public string AgentId { get; set; }
}
J'espère que cet exemple aide à illustrer comment publier un objet complexe.
Beau travail ici! – jeffreypriebe
Ça a l'air génial - Les liens du blog et des codes d'attributs personnalisés ne fonctionnent plus - pouvez-vous republier? – littlechris
Cette solution nécessite des modifications côté client et côté serveur. Je sais que vous aviez besoin de cela il y a longtemps, mais je peux aussi fournir un lien vers une approche différente, qui utilise un simple plugin jQuery permettant de convertir n'importe quel objet Javascript en un formulaire que le classeur par défaut comprend et le modèle lie aux paramètres. Aucun filtre requis. http://erraticdev.blogspot.com/2010/12/sending-complex-json-objects-to-aspnet.html Je ne sais pas comment vous avez résolu les erreurs de validation mais j'ai une solution pour cela aussi: http://erraticdev.blogspot.com/2010/11/handling-validation-errors-on-ajax.html –