Razor inside javascript键值声明?
Razor inside javascript key value declaration?
考虑到需要将视图数据中的数据提取到 javascript key/value 对象中:
var stuff = {
something : [@someVar.Prop2, @someVar.Prop3, etc]
};
我想让密钥具有 someVar.Prop1
的 "name" 以便:
var stuff = {
@someVar.Prop1 : [@someVar.Prop2, @someVar.Prop3, etc]
};
然而,当我在上面的第二个代码块中使用表单时,我在冒号处收到 Expected identifier, string or number
错误:
@someVar.Prop1 : [@someVar.Prop2, etc]
---------------X (x marks the spot)
我需要如何格式化剃刀代码,以便它知道我想说什么?
您可以用引号 '
或 "
将剃刀表达式括起来,将它们输出到 javascript 块中。如果需要正确保留类型,可以使用 parseInt()
或 parseFloat()
等方法。
示例:
var stuff = {
value1 : '@val1',
value2 : [ parseInt('@val2'), parseInt('@val3') ]
};
如果您需要赋值的左侧是可变的,您可能需要构建一个 json 字符串,然后将其解析为对象。像这样,我的报价可能会被关闭。
var stuffJson = '{"@value1" : "@val1", "@value2" : "[ @val2, @val3 ]" }';
var stuff = JSON.parse(stuffJson);
如果您经常这样做,您可能需要考虑在控制器中使用 Json()
方法来帮助您更轻松地构建这些。您可以构建一个键/值字典并输出 json:
public virtual ActionResult GetStuff()
{
string value1 = "key1",
value2 = "key2",
val1 = "str1",
val2 = "str2",
val3 = "str3";
var dict = new Dictionary<string, object>
{
{ value1, val1},
{ value2, new List<string> { val2, val3} },
};
return Json(dict, JsonRequestBehavior.AllowGet);
}
输出:
{"key1":"str1","key2":["str2","str3"]}
答案是忽略 Visual Studio 对问题的抱怨,因为代码运行并且没有抛出错误:
@country.CountryCode: ['@someVar.Prop1', '@someVar.Prop2', etc],
您绝对不应该尝试在 Razor 视图中逐个构建 JSON。这很容易出错。
要扩展@DLeh 的答案,您可以构建一个包含您想要的值的字典,在您的 Razor 视图中将其序列化为 JSON,然后将其分配给您的变量 :
@{
// Assume that someVar is provided from somewhere else;
// this is just for demonstration
var someVar = new { Prop1 = "My Prop", Prop2 = "Prop Value", Prop3 = 7 };
}
@{
var obj = new Dictionary<string, object>
{
{someVar.Prop1, new object[] { someVar.Prop2, someVar.Prop3 } }
};
}
<script>
var stuff = @Html.Raw(Json.Encode(obj));
</script>
渲染输出:
<script>
var stuff = {"My Prop":["Prop Value",7]};
</script>
考虑到需要将视图数据中的数据提取到 javascript key/value 对象中:
var stuff = {
something : [@someVar.Prop2, @someVar.Prop3, etc]
};
我想让密钥具有 someVar.Prop1
的 "name" 以便:
var stuff = {
@someVar.Prop1 : [@someVar.Prop2, @someVar.Prop3, etc]
};
然而,当我在上面的第二个代码块中使用表单时,我在冒号处收到 Expected identifier, string or number
错误:
@someVar.Prop1 : [@someVar.Prop2, etc]
---------------X (x marks the spot)
我需要如何格式化剃刀代码,以便它知道我想说什么?
您可以用引号 '
或 "
将剃刀表达式括起来,将它们输出到 javascript 块中。如果需要正确保留类型,可以使用 parseInt()
或 parseFloat()
等方法。
示例:
var stuff = {
value1 : '@val1',
value2 : [ parseInt('@val2'), parseInt('@val3') ]
};
如果您需要赋值的左侧是可变的,您可能需要构建一个 json 字符串,然后将其解析为对象。像这样,我的报价可能会被关闭。
var stuffJson = '{"@value1" : "@val1", "@value2" : "[ @val2, @val3 ]" }';
var stuff = JSON.parse(stuffJson);
如果您经常这样做,您可能需要考虑在控制器中使用 Json()
方法来帮助您更轻松地构建这些。您可以构建一个键/值字典并输出 json:
public virtual ActionResult GetStuff()
{
string value1 = "key1",
value2 = "key2",
val1 = "str1",
val2 = "str2",
val3 = "str3";
var dict = new Dictionary<string, object>
{
{ value1, val1},
{ value2, new List<string> { val2, val3} },
};
return Json(dict, JsonRequestBehavior.AllowGet);
}
输出:
{"key1":"str1","key2":["str2","str3"]}
答案是忽略 Visual Studio 对问题的抱怨,因为代码运行并且没有抛出错误:
@country.CountryCode: ['@someVar.Prop1', '@someVar.Prop2', etc],
您绝对不应该尝试在 Razor 视图中逐个构建 JSON。这很容易出错。
要扩展@DLeh 的答案,您可以构建一个包含您想要的值的字典,在您的 Razor 视图中将其序列化为 JSON,然后将其分配给您的变量
@{
// Assume that someVar is provided from somewhere else;
// this is just for demonstration
var someVar = new { Prop1 = "My Prop", Prop2 = "Prop Value", Prop3 = 7 };
}
@{
var obj = new Dictionary<string, object>
{
{someVar.Prop1, new object[] { someVar.Prop2, someVar.Prop3 } }
};
}
<script>
var stuff = @Html.Raw(Json.Encode(obj));
</script>
渲染输出:
<script>
var stuff = {"My Prop":["Prop Value",7]};
</script>