Programming

Sencha Architect에서 만든 extJS의 app.js를 ASP.NET MVC 4에 간단히 띄워보기

콜러스 XXII 2013. 5. 31. 17:55



Sencha Architect에서 만든 extJS의 app.js를 ASP.NET MVC 4에 올려보기 위해 

이리저리 알아보다가 다음의 방법데로 하니 되었다.


1. ASP.NEET MVC 4 프로젝을 하나 만든다.

2. Sencha Architect의 작업 폴더를 ASP.NEET MVC 4 프로젝 아래로 두고 작업한다.

3. app.js를 생성한다. 물론 Control도 몇개 올려 본다.

4. View/Shared의 _Layout.cshtml의 <head>에 다음을 추가한다.


   <script src="http://cdn.sencha.com/ext/gpl/4.2.1/ext-all.js"></script>

   <link rel="stylesheet" href="http://cdn.sencha.com/ext/gpl/4.2.1/resources/ext-theme-classic/ext-theme-classic-all.css">

   

   물론 Local에 깔려 있다면 Local것을 쓰면 된다. 나는 로컬에 깔아서 번들을 지정했다.


            bundles.Add(new ScriptBundle("~/bundles/extjs").Include(

                "~/Scripts/ext-4.2.1.883/ext-all.js"

                ));

            bundles.Add(new StyleBundle("~/Content/extjs/css").Include(                

                "~/Scripts/ext-4.2.1.883/resources/ext-theme-classic/ext-theme-classic-all.css"

                ));


   페이지에서는 다음과 같이 했다,


@Styles.Render("~/Content/extjs/css")

@Scripts.Render("~/bundles/extjs")

              

5. App_Start의 BundleConfig.cs에 다음을 추가한다.


bundles.Add(new ScriptBundle("~/bundles/appmain").Include(   // 가상 경로 이름 지정

// 실제 모든 경로를 포함해야 한다. 아마 서브 폴더도 패턴지정 가능 할 것이다.

                "~/<Sencha Architect 프로젝트 작업폴더>/app/model/*.js",  

                "~/<Sencha Architect 프로젝트 작업폴더>/app/store/*.js",  

                "~/<Sencha Architect 프로젝트 작업폴더>/app/view/*.js",  

                "~/<Sencha Architect 프로젝트 작업폴더>/app.js"                

                ));

6. View에서 현재 Default로 지정된 View의 cshtml을 열고 다음을 추가한다. (Index.cshtml)


   @Scripts.Render("~/bundles/appmain") 


7. Scripts 폴더에 보면 _references.js가 있다. 여기에 다음을 추가한다. (슬래쉬 3개는 반드시 있어야 한다.)


   /// <reference path="app.js" />

그러면 녹차를 볼수 있다.

참고로 extJS에서 ajax로 WCF Call 할때 일부 브라우저에서 Access-Control-Allow-Origin 에러가 날때가 있는데 Web.config에서 다음과 같이 해주어야 한다.


<system.webServer>

     <httpProtocol>

      <customHeaders>

        <add name="Access-Control-Allow-Origin" value="*" />

        <add name="Access-Control-Allow-Headers" 

                value ="Origin, X-Requested-With, Content-Type, Accept"/>

      </customHeaders>

    </httpProtocol>        

</system.webServer>



하다보니 "~/bundles/appmain" 번들 폴더 지정은 약간의 생각이 필요했다.

폴더가 없으면 Exception이 나는 것이다. 그래서 간단히 다음의 함수를 하나더 만들어서 

이용해본다.


         static string[] GetExtJSExtJSFileNames(

                                         string strAbsoluteWorkingPath, 

                                         string strRelativeExtJSProjectWorkingFolder)

        {

            // Sencha Architect가 생성하는 모든 폴더를 넣어 줘야할거 같음.


            string[] strFoldersToBeChecked = {

                                                 strRelativeExtJSProjectWorkingFolder + "/app/model",

                                                 strRelativeExtJSProjectWorkingFolder + "/app/store",

                                                 strRelativeExtJSProjectWorkingFolder + "/app/view",

                                                 strRelativeExtJSProjectWorkingFolder + "/app/override",

                                             };


            List<string> strListRet = new List<string>();


            foreach (string s in strFoldersToBeChecked)

            {

                if (Directory.Exists(strAbsoluteWorkingPath + @"\" + s) == true)

                {

                    strListRet.Add("~/" + s + "/*.js");

                }

            }


            strListRet.Add("~/" + strRelativeExtJSProjectWorkingFolder + "/app.js");


            return strListRet.ToArray();

        }


번들 추가는 ...


string[] strFiles = GetExtJSExtJSFileNames(

                                        <Web 프로젝트 루트 절대 경로>,

                                        <Web 프로젝트 루트 경로 아래의 Sencha Architect 프로젝트 상대 경로>);

bundles.Add(new ScriptBundle("~/bundles/appmain").Include(strFiles));


이렇게 해서 Exception을 최대한 방지해본다.