通过 ajax 从名称空间中删除斜杠向控制器发送请求?

Sending request to the controller via ajax removing slashes from namespace?

onclick="loadInlineEditor({
                        class:'<?= get_class($content) ?>', 
                        model_id:<?= $content->id ?>,
                        attribute:'description'
                    })"

get_class($content) 的输出应为 app\models\Page

但是在控制器内部,这个 appmodelsPage 是我通过将其作为 AJAX 请求

发送回来的方式

AJAX 代码:-

function loadInlineEditor(data) {
        $.ajax({
                url: '<?= Url::toRoute(["//url"]) ?>',
                type: 'POST',
                data: data,
                dataType: 'json'
            })

输出代码:-

Array
(
    [class] => appmodelsPage
    [model_id] => 1
    [attribute] => description
)

不是 ajax 删除斜线。因为php生成的js代码是这样的:

loadInlineEditor({
    class:'app\models\Page', 
    model_id: 1,
    attribute:'description'
})

但是JS字符串中的\(反斜杠)字符被用作转义字符。如果你想在 JS 字符串中使用反斜杠,你必须自己将其转义为 \.

为此,您可以使用 addslashes() php 函数或 json_encode().

onclick="loadInlineEditor({
    class:'<?= addslashes(get_class($content)) ?>', 
    model_id:<?= $content->id ?>,
    attribute:'description'
})"

json_encode 将在字符串周围添加 ",因此您不必也使用引号。

onclick="loadInlineEditor({
    class:<?= json_encode(get_class($content)) ?>, 
    model_id:<?= $content->id ?>,
    attribute:'description'
})"

因为****是一个转义字符,所以你需要先转义它,然后再将他存储在class属性中。

因此您的代码变为:

onclick="loadInlineEditor({
                        class:'<?= addslashes(get_class($content)) ?>', 
                        model_id:<?= $content->id ?>,
                        attribute:'description'
                    })"

事实上,addslashes 将 app\models\Page 发送到 class 属性并将其保存到 app\models\Page