有没有办法将模型数据传递给外部 javascript,而我的 View 上没有隐藏变量。我正在使用谷歌地图来显示图钉, map 是通过 javascript 加载的,同时我有(大)纬度、经度信息列表作为我的模型数据的一部分,这些信息是在我的请求期间获取的。我不想在我的 html 中有一个很长的隐藏变量列表,也不想再减少一次对服务器的 ajax 调用以在我的 javascript 中获取所需的信息(纬度/经度)。有没有办法有效地做到这一点?
谢谢。
最佳答案
最简洁的答案是不。”
如果您需要在 View 旁边返回原始数据模型,唯一的选择是将数据嵌入到 View 中。这两个选项是:
在 HTML 元素中(有点尴尬的 IMO):
<div id="myData" data-model="{"Name": "Jason"}"></div>
在脚本中:
<script>
var myData = {Name: Jason};
</script>
我更喜欢第二种方法,因为没有 HTML 转义。
我同意这样做有点烦人,但是一个请求就是一个请求……它只是一个数据流。以这种方式引导数据是相当普遍的,所以也许 future 版本的 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>
关于asp.net-mvc-2 - 将模型数据传递给外部 javascript,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4426369/