0

我有 AngularJS 控制器和服务,它们引用托管在服务器 1 中的代码的一部分。因此,要获取或发布数据,我引用了

var getUsers = $resource('http://localhost:2211/projectname/users/getusers', 
{
    id: viewModel.user.Id
}); 

getUsers.get(function (result: users.usersResource)
{
   if(result != null)
   {
       $scope.viewModel.firstName = result.firstName; 
   }
}

我的问题是如何设置 web.config 文件来保存上面提到的 url 并从我的控制器或服务页面调用它,而不是在每次发布或获取时对 url 进行硬编码。

请帮忙。

4

2 回答 2

5

有比这更简单的方法,您可以直接从 razor 读取您的 javascript:

假设我希望我的 _Layout.cshtml 包含我所有视图的值,那么在你的 cshtml 中:

<!DOCTYPE html>
<html ng-app="WebAthena" ng-controller="AppController">
<head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width" />
    <title>@ViewBag.Title</title>
    @Styles.Render("~/Content/css")
    <script>
        var WebApiBaseUri = '@System.Configuration.ConfigurationManager.AppSettings["WebApiBaseUri"]';
    </script>
</head>

请注意,在脚本中,我可以将 razor 中的 c# 代码注入到 javascript 中。我还用一对撇号的“'”结束了 C# 代码

当我运行代码时,这就是我的 javascript 的样子:

var WebApiBaseUri = 'http://localhost:40567';

因为这个脚本被提前执行,所以 Angular 可以将它识别为一个全局变量。

或者您可以在角度常数内注入它,因此您可以将上面的代码行更改为:

//var WebApiBaseUri = '@System.Configuration.ConfigurationManager.AppSettings["WebApiBaseUri"]';
app.constant("WebApiBaseUri", '@System.Configuration.ConfigurationManager.AppSettings["WebApiBaseUri"]');

转换为:

//var WebApiBaseUri = 'http://localhost:40567';
app.constant("WebApiBaseUri", 'http://localhost:40567');

然后您可以将此代码注入角度控制器、工厂、服务等

于 2015-10-12T20:59:53.023 回答
3

据我所知,您无法从客户端站点(javascript 等)获取 web.config 信息。因此,您无法从角度查看 web.config 以获取 url。

如果您想要一个可以以角度引用的 URL 对象/列表 - 比如您的 $ressource url - 并且 URL 需要存储在代码隐藏中,无论是在 web.config 还是代码中,那么我建议创建一个返回一个处理程序角度常数与从它设置的值。

解决方案1(服务器端)

这是一个例子:

namespace App.Handlers
{
    public class ApiUrls : IHttpHandler
    {
        public class UrlItems
        {
            // Properties here doesn't need to be const. They can be taken from the web.config it you want to
            public string GetUsers = "http://localhost:2211/projectname/users/getusers";
            public string AddUser = "http://localhost:2211/projectname/users/add";
            public string UpdateUser = "http://localhost:2211/projectname/users/update";
        }

        public void ProcessRequest(HttpContext context)
        {
            context.Response.ContentType = "application/javascript";

            var serializer = new JavaScriptSerializer();
            var script = string.Format(@"
                (function() {{

                    'use strict';

                    angular
                        .module('YOUR_MODULE_NAME_HERE')
                        .constant('ApiUrls', {0});
                }})();
            ",
            serializer.Serialize(new UrlItems()));

            context.Response.Write(script);
        }
    }
}

然后 web.config 中的一些代码可以将文件包含在您的 html 文件中:

<system.webServer>
    <handlers>
        <add path="/js/ApiUrls.js" name="App.Handlers.ApiUrls" type="App.Handlers.ApiUrls, App, Version=1.0.0.0, Culture=neutral" verb="GET" />
    </handlers>
</system.webServer>

然后,您可以将该常量注入您的控制器、服务、工厂等,并从中获取值:

angular
    .module('YOUR_MODULE_NAME_HERE')
    .controller('UserController', ['ApiUrls', function(ApiUrls) {

        var getUsers = $resource(ApiUrls.GetUsers, 
        {
            id: viewModel.user.Id
        });     

    }]);

解决方案 2(仅客户端)

或者更简单,如果您只想要 url 列表但不关心它们是存储在代码隐藏还是客户端,那么只需添加角度常量并将其包含在您的 html 中并忘记处理程序。然后只需创建一个包含如下内容的 js 文件。

(function() {
    'use strict';

    angular
        .module('YOUR_MODULE_NAME_HERE')
        .constant('ApiUrls', { 
            GetUsers: "http://localhost:2211/projectname/users/getusers", 
            AddUser: "http://localhost:2211/projectname/users/add", 
            UpdateUser: "http://localhost:2211/projectname/users/update" 
        });
})();

然后将该文件包含在您的 html 文件中

<script src="/StaticFiles/ApiUrls.js"></script>

请记住,如果您将代码中的属性名称更改为其他名称,那么您仍然需要将其更改为 angular。

我希望我能提供帮助:)

于 2014-08-12T20:22:25.250 回答