【问题标题】:MVC Google map API key reading from database从数据库读取 MVC Google 地图 API 密钥
【发布时间】:2018-07-02 21:21:40
【问题描述】:

我的网页上有谷歌地图。它工作正常。

但是,我像谷歌示例一样对地图键进行硬编码

 <script src="https://maps.googleapis.com/maps/api/js?key=YOUR_API_KEY&callback=initMap" async defer></script>

You_API_KEY 是硬编码值。

首先,我阅读了各种页面。我知道我无法隐藏这把钥匙。 但是,我确实想使用变量,而不是硬编码密钥。如果密钥更改,我必须更改 javascript。加上CS代码,我也调用了这个函数。最好保存在变量中,而不是到处硬编码。

我该怎么办?

谢谢

【问题讨论】:

  • 您可以通过将其替换为 C# 变量/表达式来注入该值。前 (js?key=@(someC#ExpressionWhichReturnsKey)&amp;callback=initMap)
  • @Shyju:请使用回答机制回答问题,以便被接受和关闭。

标签: javascript c# asp.net-mvc google-maps-api-3


【解决方案1】:

脚本标签包含在剃刀视图中,这意味着您可以执行一些 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

【讨论】:

  • 感谢您的建议。实际上,我尝试用()括起来,但它失败了,所以我删除了它,它可以工作。抱歉,我正在测试我的程序并忘记了这一点。您的 C# 示例非常好。我没有费心创建过滤器
猜你喜欢
  • 1970-01-01
  • 2021-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多