有没有办法将Model数据传递给外部javascript,而我的View上没有隐藏变量。我使用谷歌地图显示图钉,地图是通过javascript加载的,同时我有(大)纬度列表,经度信息作为我的模型数据的一部分,在我的请求中提取。我不想在我的html中有一长串隐藏变量,还要减少一次ajax调用服务器来获取我的javascript中所需的信息(lat / lon)。有效的方法吗?
感谢。
答案 0 :(得分:1)
简短的回答是“不。”
如果您需要在视图旁边返回原始数据模型,唯一的选择是在视图中嵌入数据。这两个选项是:
在HTML元素中(一种尴尬的IMO):
<div id="myData" data-model="{"Name": "Jason"}"></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>