내 ASP.NET MVC 5 응용 프로그램에서 특정 로캘 (es-CL)을 사용하려고합니다. 다음이 있습니다.
- web.config uiculture 및 culture를 “es-CL”로 변경했습니다.
- Globalize 및 jQuery.Validation.Globalize 패키지를 설치했습니다.
- 내보기에서 기본 언어를 변경했습니다.
<html lang="es-cl">
- 새 번들을 생성하고 적절한보기에 포함했습니다.
에서 BundleConfig.cs :
bundles.Add(new ScriptBundle("~/bundles/jqueryval")
.Include("~/Scripts/jquery.validate.js")
.Include("~/Scripts/jquery.validate.unobtrusive.js"));
bundles.Add(new ScriptBundle("~/bundles/globalization")
.Include("~/Scripts/globalize/globalize.js")
.Include("~/Scripts/globalize/cultures/globalize.culture.es-CL.js")
.Include("~/Scripts/jquery.validate.globalize.js"));
적절한보기에서 :
@section Scripts {
@Scripts.Render("~/bundles/jqueryval")
@Scripts.Render("~/bundles/globalization")
}
그러나 생성 된 소스 코드는 다음과 같습니다.
<script src="/Scripts/jquery.validate.js"></script>
<script src="/Scripts/jquery.validate.unobtrusive.js"></script>
<script src="/Scripts/jquery.validate.globalize.js"></script>
<script src="/Scripts/globalize/globalize.js"></script>
<script src="/Scripts/globalize/cultures/globalize.culture.es-CL.js"></script>
있습니다 jquery.validate.globalize.js의 스크립트가 전에로드되는 globalize.js 내가 원하는 바가 아니다.
왜 이런 일이 발생합니까? 단일 번들의 포함 순서에 의존 할 수 있습니까? 아니면이 단일 스크립트를 다른 번들에 넣고 내보기에서 지정해야합니까?
답변
기본적으로 번들링 순서는 설명에서 지적한대로 와일드 카드가있는 이름의 알파벳순입니다. 그러나 그것은 또한 당신의 의존성 트리가 무엇이라고 생각하는지에 따라 순서를 jQuery
정하고 스크립트가 맨 위에있는 것처럼 보입니다. 다음을 구현하는 객체를 만들어야합니다 IBundleOrder
.
class NonOrderingBundleOrderer : IBundleOrderer
{
public IEnumerable<FileInfo> OrderFiles(BundleContext context, IEnumerable<FileInfo> files)
{
return files;
}
}
이것은 기본 순서를 방지합니다. 이제 사용하려면 :
var bundle = new ScriptBundle("~/bundles/globalization")
.Include("~/Scripts/globalize/globalize.js")
.Include("~/Scripts/globalize/cultures/globalize.culture.es-CL.js")
.Include("~/Scripts/jquery.validate.globalize.js");
bundle.Orderer = new NonOrderingBundleOrderer();
bundles.Add(bundle);
참조 : http://stevescodingblog.co.uk/changing-the-ordering-for-single-bundles-in-asp-net-4/
추가 읽기를 위해 MikeSmithDev의 질문에 대한 답변은 인기있는 스크립트 라이브러리의 기본 순서에 대한 추가 통찰력을 제공합니다.
답변
MVC 5의 마지막 버전 (2014 년 10 월 27 일)에서는이 클래스를 대신 사용해야합니다.
class AsIsBundleOrderer : IBundleOrderer
{
public IEnumerable<BundleFile> OrderFiles(BundleContext context, IEnumerable<BundleFile> files)
{
return files;
}
}
그리고 다른 응답과 같이 번들을 만듭니다.
var bundle = new ScriptBundle("~/bundles/globalization")
.Include("~/Scripts/globalize/globalize.js")
.Include("~/Scripts/globalize/cultures/globalize.culture.es-CL.js")
.Include("~/Scripts/jquery.validate.globalize.js");
bundle.Orderer = new AsIsBundleOrderer();
bundles.Add(bundle);
답변
번들을 만드는 동안 코드 를 줄이려면 확장 메서드를 만드는 것이 좋습니다.
인프라 클래스 필요 :
class NonOrderingBundleOrderer : IBundleOrderer
{
public IEnumerable<BundleFile> OrderFiles(BundleContext context, IEnumerable<BundleFile> files)
{
return files;
}
}
static class BundleExtentions
{
public static Bundle NonOrdering(this Bundle bundle)
{
bundle.Orderer=new NonOrderingBundleOrderer();
return bundle;
}
}
이제 다음과 같이 사용하십시오.
하나의 명령으로 모두 ?
bundles.Add(new ScriptBundle("~/bundles/jqueryval")
.NonOrdering()
.Include(
"~/Scripts/globalize/globalize.js",
"~/Scripts/globalize/cultures/globalize.culture.es-CL.js",
//...
);