ASP. NET параметр / переменная как в настройках приложения, так и в событиях сборки приложения - PullRequest
2 голосов
/ 09 июля 2020

В ASP. NET у нас есть настройки приложения и события до и после сборки приложения. Можно ли получить доступ к настройке из события перед сборкой? Или можно ввести значение параметра из события предварительной сборки?

Полный контекст:

У меня есть приложение Angular, встроенное в ASP. NET 4 Приложение веб-API. То есть мое приложение структурировано следующим образом:

+ 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 . Все, что я описал до сих пор, работает отлично.

Проблема в том, что это приложение не развертывается на root домена; он развертывается в подкаталог домена. (т.е. website.com/app вместо website.com). Три разные части моего приложения должны знать, что этот новый подкаталог следует рассматривать как root - приложение Angular должно иметь это значение root, правила перезаписи должны включать это, и некоторые части C# код также должен знать об этом новом root (подробности я сохраню здесь). В настоящее время мне пришлось указать этот подкаталог как в Pre Build Events (которые создают приложение Angular), так и в Web.config (который контролирует мои правила перезаписи) и в Настройках (к которым обращается мой вышеупомянутый C# код). Было бы лучше, если бы у меня была единственная конфигурация, из которой они все брали. Мой вышеупомянутый вопрос, по крайней мере, разрешил бы комбинацию двух из этих трех несопоставимых конфигураций.

1 Ответ

1 голос
/ 15 июля 2020

Мое предложение связано не с какими-либо событиями сборки, а скорее с bootstrap вашим angular приложением с некоторыми значениями из вида ASP хостинга. Если я правильно понимаю макет вашего приложения, вы можете перенести sh некоторые переменные в представление Razor как простые javascript, которые 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>

Абсолютный минимум Do tnet здесь: https://dotnetfiddle.net/pO2wHN. Для простоты я выбрал AngularJS (что, вероятно, не та версия, которую вы используете), но аналогичный подход должен работать и с недавними Angular.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...