Как передать данные из C # в функцию JavaScript? - PullRequest
1 голос
/ 17 марта 2019

Я новичок в веб-программировании.Я начал с учебного проекта ASP.NET, сделал html-страницу и выполнил все MVC.Теперь в моем коде C# есть массив, который я хотел бы передать функции javascript.Но я не знаю, как и я не могу найти что-либо в Интернете.

Возможно ли это, и если да, то как мне это сделать?

Обновление

Итак, я пробую ниже на основе первоначальной обратной связи.Мой проект .netcore2, поэтому я не могу использовать материал System.web.Я прочитал в Интернете, что json.NET позволяет мне выполнять сериализацию / десериализацию, поэтому я использую это вместо этого.

2-е обновление
Я обновил DeserializeObject для использования словаря, но все еще получаю то же неопределенное исключение.

Уточнение:

На стороне клиента я думаю, что приведенный ниже код вызывает исключение всплывающего окна.Таким образом, ответ не выполняется на стороне C # / MVC / Controller ... Я просто не понял, как решить эту проблему ...

 if (response.Status !== "OK") {
                alert("Exception: " + response.Status + " |  " + response.Message); 

Клиент

<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);
    }
});

C # / MVC / Контроллер

    [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;
    }

Ответы [ 3 ]

2 голосов
/ 17 марта 2019

Короткий ответ: функция на клиенте не может быть вызвана напрямую с сервера. Вам нужно, чтобы клиент запросил информацию.

JQuery - ваш самый простой путь на стороне клиента. Попробуйте что-то вроде этого:

Код клиента

   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);
        }
    });

На стороне сервера вам необходимо будет получить запрос и отправить данные обратно.

C # / MVC / Код контроллера

[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;
}

Вам понадобятся эти пространства имен в объявлении вашего контроллера:

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

Это должно помочь тебе в пути. Надеюсь, это поможет!

1 голос
/ 17 марта 2019

Что я делаю,

в c #

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

на странице aspx

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

и использование arr во внешних js-файлах.

0 голосов
/ 17 марта 2019

Есть несколько способов.

Некоторые из них сделаны непосредственно в виде MVC. Вы должны получить переменную c # в представлении. Есть 2 типичных способа сделать это: 1) в качестве модели 2) в качестве элемента ViewBag

Чтобы сделать это как переменную модели, вы хотите передать массив в функцию View () из контроллера. например,

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

в представлении, к которому вы обращаетесь, переменная помещает что-то вроде этого в верхнюю часть представления:

 @model  MyClass[]

Позже в представлении переменная присваивается переменной «Модель». например,

 @Model[0]  

Другой способ - назначить его ViewBag в контроллере:

 ViewBag.MyArray = myArray;

Тогда в представлении вы можете получить доступ к ViewBag:

@ViewBag.MyArray[0]

Так что теперь вам нужно включить его в Javascript. Это может быть сделано путем перевода переменной в код JavaScript вручную (если хотите). Есть несколько пакетов, которые отлично справятся с этой задачей. См. Newtonsoft.Json как обычный. Json - это просто выражение javascript, поэтому его можно «оценить» как javascript, поместив его туда, куда должен идти код javascript:

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

Будьте осторожны, чтобы в массиве не могло быть кода, который может быть использован пользователями для совершения плохих действий на вашей странице.

В качестве другого метода, javascript может вызывать контроллер API, который доставляет данные в формате Json. Контроллер asp.net обычно выполняет преобразование JSON для вас. Вы используете ajax-вызов из Jquery или необработанный javascript-вызов «fetch» ​​для получения данных от контроллера api.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...