【问题标题】:why i cannot pass an @ symbol in the replace()?为什么我不能在replace() 中传递@ 符号?
【发布时间】:2016-02-18 15:56:26
【问题描述】:

我在我的视图的@section 中编写了以下javascript 代码。

var mapping = {
    '@Title': 'text',
    '@ID': 'id',
    '@ParentID': 'parent',
    '@Narrative': 'value'
}
var temp = JSON.stringify(data);
for (key in mapping) {
    temp = temp.replace(new RegExp(key, 'g'), mapping[key]);

}
data = JSON.parse(temp.replace(/@/g, ''));

假设data 是上面已经声明的数组。在视图中,我不能使用语句data = JSON.parse(temp.replace(/@/g, ''));。它抛出以下错误:

解析器错误

描述:解析资源时出错 需要为该请求提供服务。请查看以下具体内容 解析错误详细信息并适当地修改您的源文件。

解析器错误消息:“/”在代码块的开头无效。 只有标识符、关键字、cmets、"(" 和 "{" 是有效的。

我传递@ 的原因是从temp 中删除所有@ 符号,但是使用MVC 代码会引发@ 符号错误。

这里是一些数组数据,最初由 zeelong 在他的post 中发布。

var data = {
    "class": {
        "@Title": "SOCIAL HISTORY",
        "@ID": "1",
        "@ParentID": "0",
        "helpNavNode": [{
            "@Title": "ALCOHOL CONSUMPTION",
            "@ID": "2",
            "@ParentID": "1",
            "helpNavNode": [{
                "@Title": " Never",
                "@ID": "3",
                "@ParentID": "2",
                "@Narrative": "ALCOHOL CONSUMPTION: Never"
            }, {
                "@Title": " Occasionally",
                "@ID": "4",
                "@ParentID": "2",
                "@Narrative": "ALCOHOL CONSUMPTION: Occasionally"
            }, {
                "@Title": " Socially",
                "@ID": "5",
                "@ParentID": "2",
                "@Narrative": "ALCOHOL CONSUMPTION: Socially"
            }, {
                "@Title": " Daily (3 beers/day) (6 pack/day)",
                "@ID": "6",
                "@ParentID": "2",
                "@Narrative": "ALCOHOL CONSUMPTION: Daily (3 beers/day) (6 pack/day)"
            }, {
                "@Title": " Is Alcoholic",
                "@ID": "7",
                "@ParentID": "2",
                "@Narrative": "ALCOHOL CONSUMPTION: Is Alcoholic"
            }, {
                "@Title": " History of Alcoholism",
                "@ID": "8",
                "@ParentID": "2",
                "@Narrative": "ALCOHOL CONSUMPTION: History of Alcoholism"
            }, {
                "@Title": " None",
                "@ID": "26",
                "@ParentID": "2",
                "@Narrative": "ALCOHOL CONSUMPTION: None"
            }, {
                "@Title": "Alcoholism Screen Question",
                "@ID": "39",
                "@ParentID": "2",
                "helpNavNode": {
                    "@Title": " Ever had a drinking problem? Last drink? ",
                    "@ID": "40",
                    "@ParentID": "39",
                    "@Narrative": "ALCOHOL CONSUMPTION:Alcoholism Screen Question: Ever had a drinking problem? Last drink? "
                }
            }]
        }, {
            "@Title": "MARITAL STATUS",
            "@ID": "9",
            "@ParentID": "1",
            "helpNavNode": [{
                "@Title": " Married",
                "@ID": "10",
                "@ParentID": "9",
                "helpNavNode": {
                    "@Title": " x 10 years",
                    "@ID": "15",
                    "@ParentID": "10",
                    "@Narrative": "MARITAL STATUS: Married: x 10 years"
                }
            }, {
                "@Title": " Divorced",
                "@ID": "11",
                "@ParentID": "9",
                "@Narrative": "MARITAL STATUS: Divorced"
            }, {
                "@Title": " Single",
                "@ID": "12",
                "@ParentID": "9",
                "@Narrative": "MARITAL STATUS: Single"
            }]
        }, {
            "@Title": "Recreational drug use",
            "@ID": "13",
            "@ParentID": "1",
            "@Narrative": ":Recreational drug use"
        }, {
            "@Title": "OCCUPATION",
            "@ID": "14",
            "@ParentID": "1",
            "helpNavNode": {
                "@Title": " works for  x 27 years",
                "@ID": "25",
                "@ParentID": "14",
                "@Narrative": "OCCUPATION: works for  x 27 years"
            }
        }, {
            "@Title": " 1 child",
            "@ID": "16",
            "@ParentID": "1",
            "@Narrative": ": 1 child"
        }, {
            "@Title": " 2/3/4/5/6 children",
            "@ID": "17",
            "@ParentID": "1",
            "@Narrative": ": 2/3/4/5/6 children"
        }, {
            "@Title": "Activities",
            "@ID": "18",
            "@ParentID": "1",
            "helpNavNode": [{
                "@Title": " walks regularly",
                "@ID": "19",
                "@ParentID": "18",
                "@Narrative": "Activities: walks regularly"
            }, {
                "@Title": " cycles for exercise",
                "@ID": "20",
                "@ParentID": "18",
                "@Narrative": "Activities: cycles for exercise"
            }, {
                "@Title": " runs 3 days/week",
                "@ID": "21",
                "@ParentID": "18",
                "@Narrative": "Activities: runs 3 days/week"
            }, {
                "@Title": " hunting and fishing",
                "@ID": "22",
                "@ParentID": "18",
                "@Narrative": "Activities: hunting and fishing"
            }, {
                "@Title": " hiking and camping",
                "@ID": "23",
                "@ParentID": "18",
                "@Narrative": "Activities: hiking and camping"
            }, {
                "@Title": " swims regularly",
                "@ID": "24",
                "@ParentID": "18",
                "@Narrative": "Activities: swims regularly"
            }]
        }, {
            "@Title": "Tobacco Use",
            "@ID": "27",
            "@ParentID": "1",
            "helpNavNode": [{
                "@Title": "Cigar, Cigarette, Pipe, Smokeless",
                "@ID": "30",
                "@ParentID": "27",
                "helpNavNode": {
                    "@Title": "10/pk year",
                    "@ID": "32",
                    "@ParentID": "30",
                    "@Narrative": "Tobacco Use:Cigar, Cigarette, Pipe, Smokeless:10/pk year"
                }
            }, {
                "@Title": "Quit Date",
                "@ID": "35",
                "@ParentID": "27",
                "@Narrative": "Tobacco Use:Quit Date"
            }, {
                "@Title": "Year Started",
                "@ID": "36",
                "@ParentID": "27",
                "@Narrative": "Tobacco Use:Year Started"
            }]
        }, {
            "@Title": "SocHx  Template",
            "@ID": "37",
            "@ParentID": "1",
            "helpNavNode": [{
                "@Title": " Living situation:  Occupation:  Tobacco:  EtOH:  Rec. drugs: ",
                "@ID": "41",
                "@ParentID": "37",
                "@Narrative": "SocHx  Template: Living situation:  Occupation:  Tobacco:  EtOH:  Rec. drugs: "
            }, {
                "@Title": " Living situation:  Occupation:  Tobacco:  EtOH:  Rec. drugs: ",
                "@ID": "42",
                "@ParentID": "37",
                "@Narrative": "SocHx  Template: Living situation:  Occupation:  Tobacco:  EtOH:  Rec. drugs: "
            }]
        }]
    }
}

【问题讨论】:

  • 可以贴出实际数据吗?
  • @Stryner 当我尝试它时不会检测到 JSON 数组键,因为键前面有一个 @ 符号
  • 实际错误是什么?问题似乎是替换没有返回有效的 JSON。在问题行之前尝试alert(temp.replace(/@/g, '')),看看你得到了什么。
  • @Will 我会从 zeelong 的帖子中提取数据,T J 在此链接中回答 stackoverflow.com/questions/35447997/…
  • @Joe 这是因为我在视图页面的“@section script{}”中使用了 js 脚本

标签: javascript jquery asp.net-mvc asp.net-mvc-4


【解决方案1】:

这是因为 Razor 认为您正在尝试编写 C# 代码。只需添加双 @ 告诉 Razor 不要这样认为。

data = JSON.parse(temp.replace(/@@/g, ''));

mapping 变量内容也一样:

var mapping = {
    '@@Title': 'text',
    '@@ID': 'id',
    '@@ParentID': 'parent',
    '@@Narrative': 'value'
}

【讨论】:

  • 当我这样做时会抛出错误 CS0103: The name 'Title' does not exist in the current context
【解决方案2】:

假设您要删除所有 @,则无需遍历每个属性并单独删除 @,一旦您对数据进行字符串化,您就可以一口气删除它们。

var obj = {
  '@a': 'val1',
  '@b': 'val2'
}

var stringy = JSON.stringify(obj)

var replaced = stringy.replace(/@/g, '')

var parsed = JSON.parse(replaced)

console.log(obj, stringy, replaced, parsed)

var oneline = JSON.parse(JSON.stringify(obj).replace(/@/g, ''))

console.log(oneline)

【讨论】:

  • 替换方法不接受@符号并在我的原始帖子中给出错误
  • 我相信这是 MVC 不喜欢在脚本部分传递 @ 符号来替换
  • 我明白了。如果您根本无法在其中放置@,那么我尝试的下一个方法是查找所有其他字符并替换不匹配的字符(又名@)。不过我相信会有更清洁的方法。
猜你喜欢
  • 2022-11-21
  • 1970-01-01
  • 2021-09-29
  • 2013-06-25
  • 2023-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多