[AJAX] Comment passer une liste d'objets complexes en paramètre d'une requête ajax vers une action mvc ?
Bonjour,
J'ai le code suivant :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105
| Mon index.cshtml :
@using MasterManyGridViewMultipleFieldsKeyRazorMvc4.Models
@model List<Master>
<script type="text/javascript">
$(function () {
debugger;
LoadingPanel.Show();
$.ajax({
type: "POST",
url: '@Url.Action("IndexPartial")',
data: @(Html.Raw(Json.Encode(Model))),
//data: @(Html.Raw(new System.Web.Script.Serialization.JavaScriptSerializer().Serialize(Json.Encode(Model)))),
datatype: 'json',
contentType:"application/json; charset=utf-8",
success: function (response) {
$("#Container").html(response);
LoadingPanel.Hide();
}
});
});
</script>
My IndexPartialView.cshtml :
@model System.Collections.IEnumerable
<br />
use of "Model"
My HomeController.cs :
public class HomeController : Controller
{
public ActionResult Index()
{
//In my real project, I do some checks to allow the connection or not
if (true)
Session["Rights"] = "OK";
else
return new EmptyResult();
return View("Index", DataProvider.GetMasters());
}
//public ActionResult IndexPartial(List<Master> m)
[HttpPost]//[HttpGet]
public ActionResult IndexPartial(string m)
//public ActionResult IndexPartial()
{
var viewModel = new System.Web.Script.Serialization.JavaScriptSerializer().Deserialize<List<Master>>(m);
//var viewModel = new System.Web.Script.Serialization.JavaScriptSerializer().Deserialize<List<Master>>(Request.QueryString[0]);
return PartialView("IndexPartialView", /*m*/viewModel);
}
}
My DataProvider.cs :
public static IEnumerable GetMasters()
{
List<Master> list = new List<Master>();
list.Add(new Master("Nancy", "Davolio", 20, "Felipe"));
list.Add(new Master("Andrew", "Fuller", 30, "Don"));
return list;
}
[Serializable]
public class Master
{
string _firstName, _secondName, _fourthName;
int _age;
public Master()
{
}
public Master(string first, string second, int age, string fourth)
{
this._firstName = first;
this._secondName = second;
this._age = age;
this._fourthName = fourth;
}
public string FirstName
{
get { return _firstName; }
set { _firstName = value; }
}
public string SecondName
{
get { return _secondName; }
set { _secondName = value; }
}
public int Age
{
get { return _age; }
set { _age = value; }
}
public string FourthName
{
get { return _fourthName; }
set { _fourthName = value; }
}
} |
Quand je regarde dans firebug au niveau de mon script, j'ai le contenu de data qui est :
Citation:
[{"FirstName":"Nancy","SecondName":"Davolio","Age":20,"FourthName":"Felipe"},{"FirstName":"Andrew","SecondName":"Fuller","Age":30,"FourthName":"Don"}
Mais quand j'arrive dans mon action j'ai une exception qui est levée:
Citation:
at System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializePrimitiveObject()
at System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializeInternal(Int32 depth)
at System.Web.Script.Serialization.JavaScriptObjectDeserializer.BasicDeserialize(String input, Int32 depthLimit, JavaScriptSerializer serializer)
at System.Web.Script.Serialization.JavaScriptSerializer.Deserialize(JavaScriptSerializer serializer, String input, Type type, Int32 depthLimit)
at System.Web.Script.Serialization.JavaScriptSerializer.DeserializeObject(String input)
at System.Web.Mvc.JsonValueProviderFactory.GetDeserializedObject(ControllerContext controllerContext)
at System.Web.Mvc.JsonValueProviderFactory.GetValueProvider(ControllerContext controllerContext)
at System.Web.Mvc.ValueProviderFactoryCollection.<>c__DisplayClassc.<GetValueProvider>b__7(ValueProviderFactory factory)
at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext()
at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext()
at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
at System.Web.Mvc.ValueProviderFactoryCollection.GetValueProvider(ControllerContext controllerContext)
at System.Web.Mvc.ControllerBase.get_ValueProvider()
at System.Web.Mvc.ControllerActionInvoker.GetParameterValue(ControllerContext controllerContext, ParameterDescriptor parameterDescriptor)
at System.Web.Mvc.ControllerActionInvoker.GetParameterValues(ControllerContext controllerContext, ActionDescriptor actionDescriptor)
at System.Web.Mvc.Async.AsyncControllerActionInvoker.<>c__DisplayClass25.<BeginInvokeAction>b__1e(AsyncCallback asyncCallback, Object asyncState)
at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult`1.Begin(AsyncCallback callback, Object state, Int32 timeout)
at System.Web.Mvc.Async.AsyncControllerActionInvoker.BeginInvokeAction(ControllerContext controllerContext, String actionName, AsyncCallback callback, Object state)
at System.Web.Mvc.Controller.<>c__DisplayClass1d.<BeginExecuteCore>b__17(AsyncCallback asyncCallback, Object asyncState)
at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult`1.Begin(AsyncCallback callback, Object state, Int32 timeout)
at System.Web.Mvc.Controller.BeginExecuteCore(AsyncCallback callback, Object state)
at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult`1.Begin(AsyncCallback callback, Object state, Int32 timeout)
at System.Web.Mvc.Controller.BeginExecute(RequestContext requestContext, AsyncCallback callback, Object state)
at System.Web.Mvc.Controller.System.Web.Mvc.Async.IAsyncController.BeginExecute(RequestContext requestContext, AsyncCallback callback, Object state)
at System.Web.Mvc.MvcHandler.<>c__DisplayClass8.<BeginProcessRequest>b__2(AsyncCallback asyncCallback, Object asyncState)
at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult`1.Begin(AsyncCallback callback, Object state, Int32 timeout)
at System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContextBase httpContext, AsyncCallback callback, Object state)
at System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContext httpContext, AsyncCallback callback, Object state)
at System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.BeginProcessRequest(HttpContext context, AsyncCallback cb, Object extraData)
at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)
Quand j'essaye de mettre GET au lieu de POST dans le type de l'appel ajax, que je change [HttpPost] en [HttpGet], que je change la définition de la method de l'action en "public ActionResult IndexPartial()", alors j'ai Request.QueryString[0] qui vaut {undefined=undefined&undefined=undefined}... Si je continue l'execution de "var viewModel = new System.Web.Script.Serialization.JavaScriptSerializer().Deserialize<List<Master>>(Request.QueryString[0]);", j'obtiens quasiement la même stacktrace, sauf que ça m'indique que l'erreur se situe au niveau de l'appel à à la méthode Derialize.
Est-ce qeu vous pouvez me dire quel doit être la bonne syntaxe de mon appel ajax et de mon action mvc s'il vous plaît ?