Как отправить JSON с функцией javascript из контроллера WebAPI без кавычек - PullRequest
0 голосов
/ 19 сентября 2019

У нас есть

  1. C # Серверная часть WebAPI-сервера
  2. узел JS-клиент SPA-интерфейс

Один из наших API генерирует объект C #, который представляет ChartJSмодель.Примерно так:

public virtual IActionResult Chart()
{
        var chartModel = GetChart();
        return new ObjectResult(chartModel);
}

Упрощенный класс ChartModel выглядит следующим образом

public class ChartJSModel
{
    ...
    public string callback { get; set; } //FUNCTION
    ...
}

Клиент получает этот JSON ObjectResult (снова упрощенный)

{
    "callback": "function(value, index, values) { return Number(value.toString());}"        
}

Функция обратного вызовав кавычках.Это нарушает ChartJS.

Вопрос

  1. Так что JSON предназначен исключительно для языка описания данных , но как мне получить C # WebAPI дляотправить обратный вызов без кавычек?
  2. Я мог бы обработать JSON на клиенте, но, возможно, есть альтернатива.

1 Ответ

1 голос
/ 19 сентября 2019

вы не можете иметь функции в JSON - в JSON значения могут быть только ... объект, массив, строка, число, ноль, истина или ложь

это не значит, что вы хотите делатьнедостижимо - вам нужно просто мыслить нестандартно ... например, на сервере отправьте {"callback": "fn1"} ... в клиенте, обработайте проанализированный JSON (то есть объект javascript, который вытеперь есть) и ищите ключ обратного вызова и, соответственно, изменяйте значение ... "fn1" для функции (.... и т. д.

, поэтому, если вы измените свой код сервера, чтобы отправить что-то вроде

{
    "type": "line",
    "data": {
        "datasets": [
        ]
    },
    "options": {
        "scales": {
            "xAxes": [{
                    "type": "logarithmic",
                    "position": "bottom",
                    "ticks": {
                        "beginAtZero": false,
                        "min": 0.0,
                        "max": "NaN",
                        "stepSize": "NaN",
                        "callback": "fn1"
                    },
                }
            ],
            "yAxes": [{
                    "type": "logarithmic",
                    "position": "left",
                    "ticks": {
                        "beginAtZero": false,
                        "min": 0.0,
                        "max": "NaN",
                        "stepSize": "NaN",
                        "callback": "fn1arrow"
                    },
                }
            ]
        },

    }
}

Затем вы можете написать такую ​​функцию, как

function fixCallbacks(obj) {
    const fns = {
        fn1: function(value, index, values) { return Number(value.toString());},
        fn1arrow: (value, index, values) => Number(value.toString()),
    };
    Object.entries(obj).forEach(([k, v]) => {
        if (typeof v === 'object' || typeof v === 'array') {
            fixCallbacks(v);
        } else if (k === 'callback') {
            obj[k] = fns[v] || obj[k];
        }
    });
}

Примечание: fn1 и fn1arrow делают одно и то же, просто показывая, что вы можете использовать функции и функции стрелок в качестве решения

Иэто должно работать - вот так

const data = {
    "type": "line",
    "data": {
        "datasets": [
        ]
    },
    "options": {
        "scales": {
            "xAxes": [{
                    "type": "logarithmic",
                    "position": "bottom",
                    "ticks": {
                        "beginAtZero": false,
                        "min": 0.0,
                        "max": "NaN",
                        "stepSize": "NaN",
                        "callback": "fn1"
                    },
                }
            ],
            "yAxes": [{
                    "type": "logarithmic",
                    "position": "left",
                    "ticks": {
                        "beginAtZero": false,
                        "min": 0.0,
                        "max": "NaN",
                        "stepSize": "NaN",
                        "callback": "fn1arrow"
                    },
                }
            ]
        },

    }
};

function fixCallbacks(obj) {
    const fns = {
        fn1: function(value, index, values) { return Number(value.toString());},
        fn1arrow: (value, index, values) => Number(value.toString()),
    };
    Object.entries(obj).forEach(([k, v]) => {
        if (typeof v === 'object' || typeof v === 'array') {
            fixCallbacks(v);
        } else if (k === 'callback') {
            obj[k] = fns[v] || obj[k];
        }
    });
}

// here we "fix" the data
fixCallbacks(data);
//
console.log(data);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...