1
votes

Comment passer des données d'une fonction C # à javascript?

Je suis un novice en matière de programmation Web. J'ai commencé avec le projet de tutoriel ASP.NET et j'ai créé une page html et j'ai fait tout le truc MVC . J'ai maintenant un tableau dans mon code C # que je voudrais passer à une fonction javascript . Mais je ne sais pas comment et je ne trouve rien en ligne.

Est-ce possible et si oui, comment dois-je procéder?

Mettre à jour p >

J'essaye donc ce qui suit sur la base des premiers retours. Mon projet est .netcore2, donc je ne peux pas utiliser les éléments System.web. J'ai lu en ligne que json.NET me permet de faire la sérialisation / désérialisation, donc je l'utilise à la place.

2e mise à jour
J'ai mis à jour le DeserializeObject pour utiliser le dictionnaire, mais j'obtiens toujours la même exception non définie.

Clarification:

Du côté client, je pense que c'est le code ci-dessous qui lève l'exception de popup. Donc, la réponse ne réussit pas du côté C # / MVC / Controller ... Je n'ai simplement pas trouvé comment résoudre ce problème ...

    [HttpPost]
    public JsonResult RespondWithData(string inputData)//JSON should contain key, action, otherThing
    {
        JsonResult RetVal = new JsonResult(new object());  //We will use this to pass data back to the client

        try
        {
            var JSONObj = JsonConvert.DeserializeObject<Dictionary<string,string>>(inputData);

            string RequestKey = JSONObj["key"];
            string RequestAction = JSONObj["action"];
            string RequestOtherThing = JSONObj["otherThing"];

            //Use your request information to build your array
            //You didn't specify what kind of array, but it works the same regardless.
            int[] ResponseArray = new int[10];

            for (int i = 0; i < ResponseArray.Length; i++)
                ResponseArray[i] = i;


            //Write out the response
            RetVal = Json(new
            {
                Status = "OK",
                Message = "Response Added",
                MyArray = ResponseArray
            });
        }

        catch (Exception ex)
        {
            //Response if there was an error
            RetVal = Json(new
            {
                Status = "ERROR",
                Message = ex.ToString(),
                MyArray = new int[0]
        });
        }
        return RetVal;
    }

<script>
var myRequest = {
    key: 'identifier_here',
    action: 'action_here',
    otherThing: 'other_here'
};

//To send it, you will need to serialize myRequest.  JSON.strigify will do the trick
var requestData = JSON.stringify(myRequest);

$.ajax({
    type: "POST",
    url: "/Home/MyPage",
    data: { inputData: requestData }, //Change inputData to match the argument in your controller method

    success: function (response) {
        if (response.Status !== "OK") {
            alert("Exception: " + response.Status + " |  " + response.Message);
        }
        else {
            var content = response;//hell if I know
            //Add code for successful thing here.
            //response will contain whatever you put in it on the server side.
            //In this example I'm expecting Status, Message, and MyArray

        }
    },
    failure: function (response) {
        alert("Failure: " + response.Status + " |  " + response.Message);
    },
    error: function (response) {
        alert("Error: " + response.Status + " |  " + response.Message);
    }
});


3 commentaires

La première étape consiste à insérer le tableau c # dans la vue. Cela peut être fait en en faisant le modèle de la vue. Dans le contrôleur de l'appel View (), passez le tableau. Dans la vue en haut, mettez @model your_type []. Dans la vue, faites-la référence comme la variable Model. Pour l'inclure dans un appel JavaScript, changez-le en Json. Et définissez une variable de script égale à la chaîne Json comme @ Html.Raw (...). Placez-le simplement là où vous l'utiliseriez en JavaScript dans une balise

3 Réponses :


0
votes

Il existe plusieurs façons.

Certains d'entre eux sont directement réalisés dans la vue MVC. Vous devez obtenir la variable c # dans la vue. Il existe 2 façons typiques de faire cela: 1) comme modèle 2) en tant qu'élément ViewBag

Pour le faire en tant que variable de modèle, vous voulez passer le tableau dans la fonction View () du contrôleur. par exemple

 <script>
      var myJavascriptArray = @Html.Raw(Json.Convert(ViewBag.MyArray));
</script>

dans la vue, vous vous référez à la variable mettre quelque chose comme ça en haut de la vue:

@ViewBag.MyArray[0]

Plus tard dans la vue, la variable est affectée à la variable "Modèle". par exemple

 ViewBag.MyArray = myArray;

L'autre façon est de l'attribuer au ViewBag dans le contrôleur:

 @Model[0]  

Ensuite dans la vue vous peut accéder au ViewBag:

 @model  MyClass[]

Vous devez maintenant le mettre en Javascript. Cela peut être fait en traduisant manuellement la variable en code javascript (si vous le souhaitez). Il existe plusieurs packages qui font un excellent travail pour vous. Voir Newtonsoft.Json comme un élément courant. Json est juste une expression javascript donc il peut être "évalué" comme javascript en le plaçant là où le code javascript irait:

 MyClass[]  myArray = new MyClass[] {  new MyClass("A"), new MyClass("B"), ...};
 View(myArray);

Attention, le tableau ne peut contenir aucun code qui être manipulé par les utilisateurs pour faire de mauvaises choses sur votre page.

Comme autre technique, le javascript peut appeler un contrôleur api qui fournit les données au format Json. Le contrôleur asp.net effectuera généralement la conversion JSON pour vous. Vous utilisez un appel ajax de Jquery, ou un appel javascript brut "fetch" pour obtenir les données du contrôleur api.


0 commentaires

2
votes

La réponse courte est qu'une fonction sur le client ne peut pas être appelée directement depuis le serveur. Vous devrez demander au client de demander les informations.

JQuery est votre chemin le plus simple côté client. Essayez quelque chose comme ceci:

Code client

using System;
using System.Collections.Generic;
using System.Web.Script.Serialization;
using System.Web.Mvc;

Côté serveur, vous devrez être en mesure de recevoir le demander et renvoyer les données.

C # / MVC / Controller Code

[HttpPost]
public JsonResult YourMethodName(string inputData)//JSON should contain key, action, otherThing
{
    JsonResult RetVal = new JsonResult();  //We will use this to pass data back to the client

    try
    {
        var JSONObj = new JavaScriptSerializer().Deserialize<Dictionary<string, string>>(inputData);
        string RequestKey = JSONObj["key"];
        string RequestAction = JSONObj["action"];
        string RequestOtherThing = JSONObj["otherThing"];

        //Use your request information to build your array
        //You didn't specify what kind of array, but it works the same regardless.
        int[] ResponseArray = new int[10];

                //populate array here

        //Write out the response
        RetVal = Json(new
        {
            Status = "OK",
            Message = "Response Added",
            MyArray = ResponseArray
         });
        }

    }
    catch (Exception ex)
    {
        //Response if there was an error
        RetVal = Json(new
        {
            Status = "ERROR",
            Message = ex.ToString(),
            MyArray = new int[0]
        });
    }
    return RetVal;
}

Vous aurez besoin de ces espaces de noms dans votre déclaration de contrôleur:

   var myRequest = {
        key: 'Put an identifier here',  //Pack myRequest with whatever you need
        action: 'Put an action here',
        otherThing: 'Put other stuff here'
    };

    //To send it, you will need to serialize myRequest.  JSON.strigify will do the trick
    var requestData = JSON.stringify(myRequest);

    $.ajax({
        type: "POST",
        url: "Your URL goes here",
        data: { inputData: requestData }, //Change inputData to match the argument in your controller method

        success: function (response) {
            if (response.Status !== "OK") {
                alert("Exception: " + response.Status + " |  " + response.Message);
            }
            else {
                //Add code for successful thing here.
                //response will contain whatever you put in it on the server side.  
                //In this example I'm expecting Status, Message, and MyArray

            }
        },
        failure: function (response) {
            alert("Failure: " + response.Status + " |  " + response.Message);
        },
        error: function (response) {
            alert("Error: " + response.Status + " |  " + response.Message);
        }
    });

Cela devrait vous aider sur la bonne voie. J'espère que ça aide!


5 commentaires

Je n'arrive pas à résoudre le javascriptserializer. Au moins, j'obtiens des erreurs de référence inconnues lorsque j'essaye.


J'ai vu la mise à jour. Si vous utilisez .NET Core, vous devrez utiliser les objets Newtonsoft.Json ou Microsoft.AspNet.Mvc.Formatters.Json à la place.


Au lieu d'utiliser JavaScriptSerializer, vous pouvez créer un nouveau modèle de classe / vue et utiliser la liaison de modèle pour transmettre vos données à votre contrôleur.


@ColbyBoren Je souhaite transmettre des données de C # à la fonction JavaScript. Je pense que je l'ai configuré pour faire l'équivalent avec Json.NET de ce qui a été décrit avec JavaScriptSerializer, mais quelque chose ne fonctionne pas comme prévu car je reçois une fenêtre contextuelle indiquant une exception non définie. Le POST semble fonctionner lorsque je regarde l'onglet réseau, mais je ne sais pas ce qui a mal tourné à partir de là.


@ToddCopeland Donc, après des jours de débogage, j'ai isolé que le problème est que RetVal renvoie un résultat indéfini. Je ne sais pas quoi faire à ce sujet. Je ne sais pas non plus ce que le segment JSONObj est censé faire dans l'extrait de code que vous avez fourni.



1
votes

Ce que je fais,

en c #

<script>
 var arr = arrayElements;
</script>

en page aspx

protected string arrayElements = String.Join("_separator_",yourArray);

et utiliser arr dans des fichiers js externes.


0 commentaires