У меня есть проект в разработке с использованием ASP.Net. И иметь рабочий сервер на AWS, используя Elastic Beanstalk.
Проблема в том, что файлы JS после того, как requireJS не загрузится с помощью созданного мной помощника. Но на моем локальном ПК, когда я отлаживаю, он отлично работает!
Я добавил requireJS, настроил его и добавил помощника для поиска и использования определенного JS-файла в соответствии с отображаемым представлением. После публикации проекта с использованием пакета веб-развертывания я загружаю и развертываю с использованием Elastic Beanstalk в соответствующем приложении. Все идет хорошо, но когда я посещаю производственную площадку, JS не работает. Помощник не загружает файл JS, но на моем локальном ПК отлаживается.
Это нижний колонтитул, где я вызываю метод в помощнике:
@using ypf.Helper
<footer>
...
</footer>
<script src="~/Scripts/dist/require.js"></script>
<script>
@Html.ViewSpecificRequireJS()
</script>
</body>
</html>
Это помощник:
RequireJSHelper.cs
using System;
using System.Configuration;
using System.IO;
using System.Text;
using System.Web;
using System.Web.Mvc;
namespace ypf.Helper
{
public static class RequireJsHelpers
{
public static MvcHtmlString RequireJs(this HtmlHelper helper, string config, string module)
{
var require = new StringBuilder();
string jsLocation = "/Scripts/";
if (File.Exists(helper.ViewContext.HttpContext.Server.MapPath(Path.Combine(jsLocation, module + ".js"))))
{
require.AppendLine("require( [ \"" + jsLocation + config + "\" ], function() {");
require.AppendLine(" require( [ \"" + module + "\"] );");
require.AppendLine("});");
}
return new MvcHtmlString(require.ToString());
}
public static MvcHtmlString ViewSpecificRequireJS(this HtmlHelper helper)
{
var action = helper.ViewContext.RouteData.Values["action"];
var controller = helper.ViewContext.RouteData.Values["controller"];
var namespaces = helper.ViewContext.RouteData.DataTokens["namespaces"];
if (namespaces != null)
{
string namespacesToString = ((string[])namespaces)[0].Replace(".", " ");
string[] namespacesWordList = namespacesToString.Split(' ');
string namespacesWord1 = ((string[])namespacesWordList)[2];
string namespacesWord2 = ((string[])namespacesWordList)[3];
return helper.RequireJs("config.js", string.Format("views/{0}/{1}/{2}/{3}", namespacesWord1, namespacesWord2, controller, action));
} else
{
return helper.RequireJs("config.js", string.Format("views/{0}/{1}", controller, action));
}
}
}
}
Итак, я хочу, чтобы этот вывод на производство после визуализации:
</footer>
<script src="/Scripts/dist/require.js"></script>
<script>
require( [ "/Scripts/config.js" ], function() {
require( [ "views/Home/Index"] );
});
</script>
Вместо этого я получаю это:
</footer>
<script src="/Scripts/dist/require.js"></script>
<script>
</script>
Опять же, он дает ожидаемый результат при локальной отладке, но не на рабочем сервере, когда я загружаю и развертываю .zip, используя Elastic Beanstalk
Решение:
Позвольте пояснить тем, кто читает это, что эта проблема не была вызвана AWS Beanstalk. Это может произойти в любом облачном сервисе, так как проблема была в файле, который я создал.
Благодаря ответу @ BowB и @ Abdul .
Это утверждение вернуло false, потому что переменная jsLocation = "/Scripts/"
не имела ~
, и при рендеринге в работе ей требовался символ ~
, чтобы сервер мог понять, где найти папку Scripts.
Итак, моей первой попыткой было добавление ~
к значению jsLocation
, например jsLocation = "~/Scripts/"
, а затем загрузка и развертывание снова, это работало как чудо, но потом, когда я отлаживал локально, это не понять, где найти папку Scripts в объявлении RequireJS require
:
require(["~/Scripts/config.js"])
Кажется, что при сборке пакета развертывания C # compile и RequireJS понимают символ ~
по-разному. Если в файле C # обнаружен символ ~
, он понимает, является ли он корневым каталогом, в котором находится папка Scripts, но в RequireJS он понимает другое место или не допустит ~
.
Итак, окончательное решение я конкатенировал "~"
перед переменной jsLocation
в операторе IF:
if (File.Exists(helper.ViewContext.HttpContext.Server.MapPath(Path.Combine("~" + jsLocation, module + ".js"))))
Вместо добавления к значению jsLocation
Теперь он находит папку Scripts в Debug и в Production.
Для тех, кто пытается использовать requireJS в .Net проекте, которому может понадобиться это решение.