剃刀里面的javascript键值声明?

时间:2015-01-27 20:44:50

标签: javascript c# razor key-value

鉴于需要从viewdata中提取数据到javascript键/值对象:

var stuff = {
    something : [@someVar.Prop2, @someVar.Prop3, etc]
};

我想让密钥具有someVar.Prop1的“名称”,以便:

var stuff = {
    @someVar.Prop1 : [@someVar.Prop2, @someVar.Prop3, etc]
};

然而,当我在上面的第二个代码块中使用表单时,我在冒号处出现Expected identifier, string or number错误:

@someVar.Prop1 : [@someVar.Prop2, etc]
---------------X (x marks the spot)

我如何格式化剃刀代码以便它知道我想说什么?

3 个答案:

答案 0 :(得分:2)

你绝对不应该在你的Razor视图中逐个构建你的JSON。这很容易出错。

要扩展@ DLeh的答案,您可以做的是构建所需值的字典,在Razor视图中将其序列化为JSON,并将其分配给变量as shown here

@{
    // 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>

答案 1 :(得分:1)

您可以在引号'"中包围剃刀表达式,以将它们输出到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"]}

答案 2 :(得分:-1)

答案是在代码运行时忽略Visual Studio对问题的抱怨,并且不会抛出任何错误:

@country.CountryCode: ['@someVar.Prop1', '@someVar.Prop2', etc],