내 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",
//...
);
