脚本标签包含在剃刀视图中,这意味着您可以执行一些 C# 表达式来获取 api 键值。您的服务器代码可以读取此值并将其传递给视图。
最简单的方法是通过 ViewBag 传递它。您可以在您的操作方法中将 api 键值设置为 viewbag 字典
ViewBag.MyApiKey = "123";
而在布局视图中,你可以使用这个
<script src="https://maps.googleapis.com/maps/api/js?key=@(ViewBag.MyApiKey)&callback=initMap" async defer></script>
我只是将值硬编码为“123”。您可以从存储(数据库表/配置文件等)中读取实际值并将该值设置为 viewbag 字典。
如果您使用 ViewBag 方法,我建议您编写一个自定义过滤器来执行此操作,以便您可以全局应用此过滤器,而不是在每个操作方法中设置 viewbag 字典项。
public class LoadApiKeys : ActionFilterAttribute, System.Web.Mvc.IActionFilter
{
public void OnActionExecuting(ActionExecutingContext filterContext)
{
var apiKey = "G12345";
//to do : Read from db instead of hard coded value
filterContext.Controller.ViewBag.GoogleApiKey =apiKey;
}
public void OnActionExecuted(ActionExecutedContext filterContext)
{
}
}
并在全局范围内注册此过滤器,以便为所有调用执行该过滤器
public class FilterConfig
{
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new LoadApiKeys());
}
}
假设FilterConfig.RegisterGlobalFilters是从Global.asax调用的
基本上,您可以执行任何返回字符串值的 C# 表达式,并在它位于剃刀视图内时在脚本标记中使用该值。例如,您可以编写一个辅助方法来执行此操作
public static class WebExtensionMethods
{
public static string GetMyApiKey()
{
return "GetApiKeyFromDbAndReturnThat";
}
}
在剃刀视图中
<script src="https://maps.googleapis.com/maps/api/js?key=@(WebExtensionMethods.GetMyApiKey())&callback=initMap" async defer></script>
如果您使用的是 Asp.Net core 2.0,您可以在视图中进行依赖注入。有了这个,您可以创建一个可以返回密钥并将其注入视图并使用它的服务。有关视图中 DI 的示例代码,请参阅 this answer。