Najpierw pobierz kod JavaScript, JSON2.js, to pomoże nam serializować obiekt w łańcuch.
W moim przykładzie mam opublikowania wiersze o jqGrid poprzez 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");
}
}
});
Teraz na kontrolerze:
[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);
}
utworzyć klasę JsonFilter (dzięki nawiązaniu 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;
}
}
}
Utwórz kolejną klasę więc filtr można analizować ciąg JSON do rzeczywistej manipulowanego obiektu tej klasy comissionsJS są wszystkie wiersze mojego 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; }
}
Mam nadzieję, że ten przykład pomoże zilustrować, jak opublikować złożony obiekt.
Dobra robota tutaj! – jeffreypriebe
Wygląda świetnie - posty na blogu i niestandardowe linki do kodów atrybutów już nie działają - czy możesz je ponownie opublikować? – littlechris
To rozwiązanie wymaga zmian po stronie klienta i serwera. Wiem, że potrzebowałeś tego dawno temu, ale równie dobrze mogę podać link do innego podejścia, które wykorzystuje prostą wtyczkę jQuery, która umożliwia konwersję dowolnego obiektu JavaScript w formę, którą domyślny model bindownicy rozumie i model wiąże z parametrami. Nie wymaga filtrów. http://erraticdev.blogspot.com/2010/12/sending-complex-json-objects-to-aspnet.html Nie wiem, jak rozwiązać błędy sprawdzania poprawności, ale mam również rozwiązanie tego problemu: http://erraticdev.blogspot.com/2010/11/handling-validation-errors-on-ajax.html –