将模型数据传递给外部javascript

时间:2010-12-13 06:39:34

标签: asp.net-mvc-2

有没有办法将Model数据传递给外部javascript,而我的View上没有隐藏变量。我使用谷歌地图显示图钉,地图是通过javascript加载的,同时我有(大)纬度列表,经度信息作为我的模型数据的一部分,在我的请求中提取。我不想在我的html中有一长串隐藏变量,还要减少一次ajax调用服务器来获取我的javascript中所需的信息(lat / lon)。有效的方法吗?

感谢。

1 个答案:

答案 0 :(得分:1)

简短的回答是“不。”

如果您需要在视图旁边返回原始数据模型,唯一的选择是在视图中嵌入数据。这两个选项是:

在HTML元素中(一种尴尬的IMO):

<div id="myData" data-model="{&quot;Name&quot;: &quot;Jason&quot;}"></div>

在剧本中:

<script>
  var myData = {Name: Jason};
</script>

我更喜欢第二种方法,因为没有HTML转义。

我同意这样做有点烦人,但是一个请求就是一个请求......它只是一个数据流。以这种方式引导数据是相当普遍的,因此未来版本的MVC可能会有一种更简洁的方式来返回它(但它可能看起来就像我上面的一个示例)。

除此之外,正如您所提到的,您可以执行额外请求以仅在JSON响应中接收模型。

编辑:

我有一个HtmlHelper来支持这个......

public static MvcHtmlString ToScriptVariable<T, TMember>(this T value, Expression<Func<T, TMember>> expression) where T : class 
{
    var member = expression.Body as MemberExpression;
    if (member == null)
        throw new ArgumentException("Expression must be a member expression.", "expression");

    var expressionValue = expression.Compile()(value);
    var serializer = new JavaScriptSerializer();
    var seralizedData = serializer.Serialize(expressionValue);

    var tag = new TagBuilder("script");
    tag.Attributes.Add("type", "text/javascript");
    tag.InnerHtml = String.Format(CultureInfo.InvariantCulture, "var {0} = {1};", member.Member.Name, seralizedData);

    return MvcHtmlString.Create(tag.ToString(TagRenderMode.Normal));
}

用法:

<%: Html.ToScriptVariable(x => Model.MyData) %>

结果:

<script type="text/javascript">var MyData = "(whatever)"</script>
相关问题