2012-02-26 5 views
1

MVC 액션을 호출하여 페이지를 리디렉션하거나 데이터를 가져와야하는 자바 스크립트 기능이있는 MVC3 애플리케이션이 있습니다.ASP.NET MVC3 - 동적으로 액션에서 자바 스크립트 만들기

현재 JavaScript는 (면도기를 사용하는) cshtml 파일에 있기 때문에 Url.Action(..)Url.Content(..) 함수를 활용할 수 있습니다.

이 파일들을 분리하려면 .js가 면도기 엔진에 의해 분명히 처리되지 않으므로 파일의 서버 측 컴파일이 손실됩니다.

cshtml 뷰를 생성하고 컨텐츠 (Reponse.ContentType)를 'application/javascript'로 리턴 할 수 있습니까? 아니면 원하는 결과를 얻을 수있는 다른 방법이 있습니까? 사전에

감사

+1

예를 들어 [이 답변] (http://stackoverflow.com/questions/9366169/mvc4-razor-confused-about-braces/9367621#9367621) - 및 다른 장소에있을 수 있습니다. 일반적으로 "엄청난"양의 자바 스크립트를 출력하는 데 Razor를 사용하는 것은 좋지 않지만 대부분이 질문에서 해당 방법 중 하나를 사용하여 문제를 해결할 수 있어야합니다. – JimmiTh

+2

URL을 사용자가 볼 수 있도록 초기화 할 수있는 라이브러리로 JS를 디자인하는 것이 더 쉬울 것입니다. –

+0

@The Kaneda - 링크 주셔서 감사합니다. 실제로 다른 답변보다 먼저 작동하고 있습니다. – sambomartin

답변

4

또는 내가 원하는 결과를 얻을 수있는 또 다른 방법은 무엇입니까?

실제로 있습니다. 해당 URL을 매개 변수로 사용하도록 자바 스크립트 함수를 디자인하십시오.

<script type="text/javascript"> 
    myJsInitialize('@Url.Action("Foo")', '@Url.Content("~/bar")'); 
</script> 

또는 또 다른 가능성은 자바 스크립트가 작업하는 DOM의 일환으로 해당 URL을하는 것입니다 : 그럼 당신이해야 할 모든 필요한 URL을보기에 초기화 호출을 떠나 전달하는 것입니다. 예를 들어의 당신이 링크를 가지고 있다고 가정하자 그리고 당신은이 링크를 클릭하는 AJAX 요청을 보내려 :

@Html.ActionLink("click me", "someaction", null, new { id = "mylink" }) 

과 별도의 js에서

이미 URL을 포함하는 링크의 href 속성을 사용 파일을 :

$('#mylink').click(function() { 
    $('#result').load(this.href); 
    return false; 
}); 

하지만이 기능에서 예를 들어 다른 URL이 필요한 경우 어떻게 될까요? 예를 들어, 드롭 다운의 선택이 변경 될 때 AJAX를 사용하여 액션을 호출해야한다고 가정 해 보겠습니다. 이 경우 드롭 다운에 HTML5 data-* 속성을 사용할 수

@Html.DropDownListFor(
    x => x.SelectedItem, 
    Model.Items, 
    new { 
     id = "myddl", 
     data_url = Url.Action("someaction") 
    } 
) 

및 후 별도의 자바 스크립트 파일 :

$('#myddl').change(function() { 
    var selectedValue = $(this).val(); 
    var url = $(this).data('url'); 
    $.post(url, { value: selectedValue }, function(result) { 
     // ... 
    }); 
}); 

우리는 더 이상 자바 스크립트 기능을 서버 측에 의존해야 할 필요가 방법을 참조하십시오 없습니다 Url.Action 또는 Url.Content과 같은 도우미? 이렇게하면 IIS 가상 디렉터리에 응용 프로그램을 배포 할 때 응용 프로그램이 작동하지 않도록 걱정하지 않고 별도의 javascript 파일에 저장할 수 있습니다.

+0

Darin에게 의견을 보내 주셔서 감사합니다. 좋은 제안은 제 시나리오에 도움이되지 않습니다. 클라이언트 자바 스크립트에 페이지 특정 서버 변수를 채우기 만하면되지만 cshtml 페이지에는 필요하지 않습니다. 귀하의 첫 번째 제안은 트릭을 할 것입니다! 그것은 @Mystere Man의 답변과 매우 비슷합니다. 단, 로컬 변수를 설정하는 함수를 사용하는 경우는 예외입니다. 모두에게 감사합니다. – sambomartin

+0

@sambomartin 스크립트를 순서대로 처리하면 스크립트를 순서대로 처리하여 종속성이있을 때 비동기 적으로로드하기가 어려워 지므로 스크립트 순서를 처리하는 데 도움이됩니다. –

2

스크립트 블록의 거의 알려지지 않은 기능은 블록에 src 특성 AND 코드를 제공 할 수 있다는 것입니다. 따라서 다음과 같이 할 수 있습니다 :

<script type="text/javascript" src="@Url.Content("~/Scripts/Myscript.js")"> 
    var myurl = `@Url.Action("SomeAction", "SomeController")`; 
</script> 

그런 다음 스크립트에서 myurl을 참조 할 수 있습니다.

+0

멋진 팁! 감사. – sambomartin

관련 문제