【问题标题】:Asp.Net MVC view how to add script src from backend?Asp.Net MVC 视图如何从后端添加脚本 src?
【发布时间】:2021-12-24 09:48:44
【问题描述】:

我有一个 MVC 视图,我在其中使用 Yandex 外部 API 进行地址搜索。

这是我必须添加的脚本才能使用 Yandex 服务。

<script src="https://api-maps.yandex.ru/2.1/?apikey=xxxxxxxxxx&lang=ru_RU" type="text/javascript">

有没有办法从后端读取这个脚本 src 而不是直接在视图中使用它,因为它包含 api 密钥?

【问题讨论】:

标签: javascript c# html jquery asp.net-mvc


【解决方案1】:

您可以使用服务器端方法从 ASP.Net 服务器“读取”脚本 src 文件。您将使用System.Net.Http.HttpClient 之类的东西执行HTTP GET。如果您要检索 JSON 数据或某些其他类型的数据以在服务器上处理,这将非常有效。

但是,C# 后端不会处理 JavaScript 指令。为此,您需要一个服务器端 JavaScript 引擎,例如 Node,或客户端的 Web 浏览器。

在视图中包含 JavaScript 文件将允许客户端的 JavaScript 引擎处理处理。但是正如您所暗示的那样,视图中的任何内容都不会对客户端隐藏。

【讨论】:

    【解决方案2】:

    您可以创建一个加载并返回脚本的Action,然后在您的html中引用该Action,例如:

    <script src='@Url.Action("LoadYandex")'>
    

    public ActionResult LoadYandex() {
        // HttpClient to get the file
        return Content(file, "text/javascript");
    }
    

    编辑更详细的动作示例,基本的“从服务器获取文件并返回内容”。寻找更详细的 SO 答案,包括错误检查等

    public async Task<ActionResult> LoadYandex()
    {
        var url = "https://api-maps.yandex.ru/2.1/?apikey=xxxxxxxxxx&lang=ru_RU"; 
    
        var httpClient = new HttpClient();
        var response = await httpClient.GetAsync(url);
        var contents = await response.Content.ReadAsStringAsync();
    
        return Content(contents, "text/javascript");
    }
    

    【讨论】:

    • 有了这个我可以得到url内容,但是当我们检查元素时,我仍然可以在浏览器的
    • 那我解释得还不够清楚。您需要删除您现有的&lt;script src="https://api-maps.yandex.ru/2.1/?apikey=xxxxxxxxxx... 并用&lt;script src='@Url.Action("LoadYandex")'&gt; 替换它,当渲染 时应该看起来像:&lt;script src="http://your_server/your_project/controller/LoadYandex"&gt; 而没有别的,所以应该在javascript中没有键。
    • 您是否从操作返回字符串"https://api-maps...."?不要那样做,加载脚本在动作中并返回内容。我跳过了这一点,因为它与加载脚本 server-side 然后传递它的原理没有直接关系。 edit 添加为 basic 实现以下载文件 server-side 并将 content(不是 url)发回给客户。
    • 感谢@freedomn-m,它有效。有没有办法从 .js 文件中调用这个动作方法?我必须在 .js 文件中再次使用该密钥。或者有没有办法保留网址“api-maps.yandex.ru/2.1/?apikey=xxxxxxxxxx&lang=ru_RU”;在另一个 .js 文件中,然后在 View 中使用它?
    • 完成var contents = await ... readasstring... 后,您可以随意操作字符串,例如contents = contents.replace("https://api-maps...", "https://you_server/controller/action")。如果您再次需要它,请考虑使用类似的替代品。本质上,您正在创建一个在服务器级别添加密钥的代理服务器。
    猜你喜欢
    • 2012-12-26
    • 2016-03-02
    • 2010-10-16
    • 1970-01-01
    • 2015-01-07
    • 2021-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多