3 votes

La méthode MVC JsonResult n'accepte pas de paramètre

J'ai une méthode MVC JsonResult qui accepte un paramètre de type chaîne :

    public JsonResult GetDestinations(string countryId)
    {
        List<Destination> destinations = new List<Destination>();

        string destinationsXml = SharedMethods.GetDestinations();
        XDocument xmlDoc = XDocument.Parse(destinationsXml);
        var d = from country in xmlDoc.Descendants("Country")
                from destinationsx in country.Elements("Destinations")
                from destination in destinationsx.Elements("Destination")
                where (string)country.Attribute("ID") == countryId
                select new Destination
                {
                    Name = destination.Attribute("Name").Value,
                    ID = destination.Attribute("ID").Value,
                };
        destinations = d.ToList();

        return Json(new JsonResult { Data = destinations}, JsonRequestBehavior.AllowGet);
    }

Avec une méthode jquery appelant la méthode :

        //Fetch Destinations
        $("#Country").change(function () {
            var countryId = $("#Country > option:selected").attr("value");
            $("#Destination").html("");
            $("#Resort").html("");
            $("#Resort").append($("<option></option>").val(0).html("---Select---"));
            $.ajax({
                type: "POST",
                traditional: true,                    
                url: "/Destinations/GetDestinations",
                data: "{countryId:'" + countryId + "'}",
                contentType: "application/json; charset=utf-8",
                dataType: "json",
                success: function (msg) {
                    BindDestinationSelect(msg)
                }
            });
        });

Cependant, le JsonResult semble ne recevoir qu'un paramètre nul. Même si Firebug montre qu'un paramètre est passé :

JSON countryId "11" Source {countryId:'11'}

Des idées ? Merci

1voto

casperOne Points 49736

Je pense que le problème réside dans la façon dont vous transmettez les données, vous le faites sous forme de chaîne :

data: "{countryId:'" + countryId + "'}",

Alors qu'en réalité, vous devriez utiliser une structure du côté client ;

data: { countryId: countryId },

jQuery devrait alors être capable de gérer correctement le passage de l'identifiant. Comme vous le faites maintenant, il essaie d'envoyer JSON au serveur, ce qui n'est pas ce que MVC attend, il attend un POST avec des paires nom/valeur.

Vous pouvez également envisager le Plugin jQuery Form car il permet de sérialiser vos structures Javascript en données POST. très facile.

1voto

StephenLewes Points 48

Ah, après de nombreuses recherches, j'ai découvert la raison de cet échec.

Rien à voir avec un JSON malformé, mais plutôt avec le fait que la méthode du contrôleur ne sait pas à quoi s'attendre si vous essayez de lui transmettre des valeurs JSON :

http://www.c-sharpcorner.com/Blogs/BlogDetail.aspx?BlogId=863

Dans mon cas, j'ai donc choisi de lui transmettre une seule valeur de type chaîne.

        $("#Country").change(function () {
            var countryId = $("#Country > option:selected").attr("value");
            $("#Destination").html("");
            $("#Resort").html("");
            $("#Resort").append($("<option></option>").val(0).html("---Select---"));
            $.ajax({
                type: "POST",
                traditional: true,
                url: "/Destinations/GetDestinations",
                data: "countryId=" + countryId,
                success: function (msg) {
                    BindDestinationSelect(msg.Data)
                }
            });

0voto

Eldho Points 395
public JsonResult BindAllData(string Userid)
    {

        List<VoteList> list = new List<VoteList>();
        var indexlist = db.TB_WebSites.ToList();
        int i = 0;
        var countlist = db.Tb_Votes.ToList();
        var VCountList = db.Tb_Votes.ToList();
        foreach (TB_WebSites vt in indexlist)
        {
            bool voted = false;
        }

        return Json(new { List = _list });

    }

    function DataBind() {
        $("#LoadingDatas").show();
        var userid = $("#FBUserId").text();
        //alert('Data : ' + userid);
        var InnerHtml = "";
        $.ajax(
            {
                url: '/Gitex/BindAllData/',
                type: 'POST',
                data: { "Userid": userid },
                dataType: 'json',
                async: true,
                success: function (data) {
                    //alert('Done');
                    //alert(data.List.length);
                    for (var i = 0; i < data.List.length; i++) {

            });

    }

Essayez ceci, ça a marché pour moi Fonction jQuery success :function(Destinations)

0voto

DK Chauhan Points 89

Je vous suggère ici de décorer votre action avec l'attribut HttpPost. Comme :-

[HttpPost]
public JsonResult GetDestinations(string countryId)
{
    List<Destination> destinations = new List<Destination>();

    string destinationsXml = SharedMethods.GetDestinations();
    XDocument xmlDoc = XDocument.Parse(destinationsXml);
    var d = from country in xmlDoc.Descendants("Country")
            from destinationsx in country.Elements("Destinations")
            from destination in destinationsx.Elements("Destination")
            where (string)country.Attribute("ID") == countryId
            select new Destination
            {
                Name = destination.Attribute("Name").Value,
                ID = destination.Attribute("ID").Value,
            };
    destinations = d.ToList();

    return Json(new JsonResult { Data = destinations}, JsonRequestBehavior.AllowGet);
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X