应用程序设置和应用程序构建事件中的 ASP.NET 参数/变量

Posted

技术标签:

【中文标题】应用程序设置和应用程序构建事件中的 ASP.NET 参数/变量【英文标题】:ASP.NET parameter/variable in both app Settings and app Build Events 【发布时间】:2020-10-30 10:31:19 【问题描述】:

在 ASP.NET 中,我们有应用程序设置,以及应用程序构建前/构建后事件。是否可以从预构建事件中访问设置?或者是否可以从 Pre Build Event 中注入 Setting 的值?

完整的上下文:

我在 ASP.NET 4 Web API 应用程序中嵌入了一个 Angular 应用程序。也就是说,我的应用的结构是这样的:

+ Solution
| - Project
|   + Properties
|   + AngularApp
|   | + dist
|   | + e2e
|   | + src
|   | - (etc)
|   + App_Start
|   + Model
|   + Global.asax
|   - Web.config
- ProjectTest

我有一些 URL 重写规则,以便任何不引用我的控制器之一的请求 website.com/x 将被重定向到 website.com/AngularApp/dist/AngularApp/x。到目前为止,我所描述的一切都运行良好。

问题是,这个应用程序没有部署到域的根目录;它被部署到域的子目录中。 (即website.com/app 而不是website.com)。我的应用程序的三个不同部分需要知道这个新的子目录应该被视为根目录 - Angular 应用程序需要将其配置为根目录,重写规则需要合并它,并且某些 C# 代码也需要知道这一点新根(我会在此处保存详细信息)。目前,我必须在 Pre Build Events(正在构建 Angular 应用程序)和 Web.config(控制我的重写规则)和 Settings(由我前面提到的 C# 代码访问)中指定这个子目录。如果我可以有一个他们都从中提取的单一配置,那就更好了。我的上述问题至少允许将这三种不同配置中的两种组合在一起。

【问题讨论】:

您是否考虑过将客户端文件复制/移动到某个适当的目录而不是 URL 重写它们?使用 MSBuild 甚至构建后事件可以轻松完成此类操作。 【参考方案1】:

我的建议与任何构建事件无关,而是使用托管 ASP 视图的一些值来引导您的 Angular 应用程序。 如果我正确理解了您的应用程序布局,您也许可以将一些变量作为纯 javascript 推送到 Razor 视图中,这些变量会在启动时被 Angular 拾取。

型号

public class SampleViewModel

    public string Path  get; set; 

控制器

public class HomeController : Controller

    [HttpGet]
    public ActionResult Index()
    
        return View(new SampleViewModel()  Path = "/app/1/test" );
    

查看

@model HelloWorldMvcApp.SampleViewModel
@
    Layout = null;


<!DOCTYPE html>
<html lang="en">
<head>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.4.7/angular.min.js"></script>
</head>
    
<body>
    <h1>Server-side path @Model.Path</h1>
    <hr/>
    <div ng-app="myApp">
        <div ng-controller="MyController">
            <h1>message</h1>
        </div>
    </div>
    <script type="text/javascript">
        var clientSidePath = "@Model.Path"; @* Razor happily renders values into javascript blocks *@
        var app = angular.module('myApp', []);
        app.controller('MyController', function($scope) 
            $scope.message = 'Client-side path ' + clientSidePath;
        );
    </script>
</body>
</html>

绝对最小的 Dotnet fiddle:https://dotnetfiddle.net/pO2wHN。为简单起见,我选择了 AngularJS(这可能不是您使用的确切版本),但类似的方法也应该适用于最近的 Angular。

【讨论】:

呵呵,没想到会这样。诚然,制作一个完整的 Razor 模板和控制器只是为了将一个属性注入到我的 Angular 应用程序中,这比我希望的要复杂一些。但它确实达到了我的目标。感谢您的想法;让我考虑一下。 哦,我假设您是从剃须刀页面之类的地方托管 SPA。 不,我只使用 ASP.NET 的“API”部分;我什至没有导入 Razor Pages 库。相反,IIS 只是将我的 Angular 应用程序作为普通静态文件提供服务。这就是为什么我不确定您的解决方案 - 尽管它很好 - 是否适合我。不过绝对感激! 您介意分享更多关于您的设置的细节吗?我最感兴趣的是你如何构建你的 Angular 应用程序,但任何你认为相关的东西都可能会有所帮助 对不起,我不是故意让你挂的。我已经用更多的上下文更新了这个问题,但你的答案仍然适用。

以上是关于应用程序设置和应用程序构建事件中的 ASP.NET 参数/变量的主要内容,如果未能解决你的问题,请参考以下文章

发布发布事件

关于asp.net中页面事件加载的先后顺序

从 ASP.Net 项目中查找 DLL 的路径

ASP.NET MVC中的Global.asax文件

在 asp.net 核心的构建后事件中运行 dotnet publish

在构建后事件中使用命令部署 asp.net mvc 网站