asp.net-mvc : js 파일의 면도기 '@'기호


90

ajax URL에 C # 함수 .csHtml를 사용하는 자바 스크립트 함수 가있는 -razor 파일이 @Url.Content있습니다.
해당 기능을 .js내보기에서 참조 하는 파일 로 이동하고 싶습니다 .

문제는 자바 스크립트가 @기호를 "알지" 못하고 C # 코드를 구문 분석하지 않는다는 것입니다. "@"기호가있는보기에서 파일
을 참조하는 방법이 .js있습니까?


답변:


87

HTML5 data-*속성을 사용할 수 있습니다 . div와 같은 일부 DOM 요소를 클릭 할 때 일부 작업을 수행하고 싶다고 가정 해 보겠습니다. 그래서:

<div id="foo" data-url="@Url.Content("~/foobar")">Click me</div>

그런 다음 별도의 javascript 파일에서 DOM으로 눈에 띄지 않게 작업 할 수 있습니다.

$('#foo').click(function() {
    var url = $(this).data('url');
    // do something with this url
});

이렇게하면 자바 스크립트 파일에 서버 측 태그가 필요하지 않고 마크 업과 스크립트를 완전히 분리 할 수 ​​있습니다.


감사. 여러 값에 대해 두통이 될 수 있다고 생각합니다. 처음에는 내 문제를 해결할 수 있다고 생각했지만 시도한 후 코드에서 너무 많은 참조를 발견하고 다른 방법을 찾기로 결정했습니다.
QMaster

19

글쎄, 방금 그것을하는 너겟에서 면도기 엔진을 찾았습니다! 의미는 @구문을 해결 합니다!
이름은 RazorJS 입니다.

Nuget의 패키지


2016 업데이트 :
패키지가 5 년 동안 업데이트되지 않았고 프로젝트 사이트 링크가 끊어졌습니다. 더 이상 사람들이이 라이브러리를 사용하도록 권장하지 않습니다.


이걸 살펴볼 수 있습니까? stackoverflow.com/questions/27702322/...
iamCR에게

첫 번째 링크가 끊어졌습니다
Memet Olsen

내가 :(를 제거 할 수 있도록 @MemetOlsen는 참으로 미안하지만, 그것의 복사본을 찾을 수 없습니다
gdoron 모니카 지원하고있다

@gdoron, 문제 없습니다. 죽은 링크에 대해 알려 드리고 싶었습니다. 말씀 하셨듯이 패키지는 5 년 동안 업데이트되지 않았으므로 어쨌든 사용하는 것이 좋지 않을 수 있습니다.
Memet Olsen

10

문제를 해결하는 한 가지 방법 은 다음과 같습니다.

자바 스크립트 함수가있는 부분보기를보기에 추가합니다.
이렇게하면 @기호를 사용할 수 있으며 모든 javascript기능이보기에서 분리됩니다.


9

두 가지 옵션이 있습니다.

  • 함수에서 매개 변수 로 값을 사용하고 뷰에서 연결
  • (JS에서 나쁜 습관으로 간주되는 공개 수준 변수 대신) 네임 스페이스를 만들고이 값을 페이지 상단에 설정 한 다음 js에서 사용합니다.

예를 들면 :

 var MyCompany = 
 {
   MyProject: {
                  MyVariable:""
               }
  };

그런 다음보기에서 설정합니다.

MyCompany.MyProject.MyVariable = @....

최신 정보

커플 링 때문에 어떤 것도 좋지 않은지 궁금 할 수 있습니다. 사실입니다. js와 뷰를 결합하고 있습니다. 그렇기 때문에 스크립트는 실행중인 위치를 인식하지 못하므로 최적이 아닌 파일 구성의 증상입니다.

어쨌든 뷰 엔진을 만들고 면도기에 대해 js 파일을 실행하고 결과를 다시 보내는 세 번째 옵션이 있습니다. 이것은 깨끗하지만 훨씬 느리므로 권장하지 않습니다.


1
+1 첫 번째 방법을합니다. 필요한 모든 데이터를 전달하는 뷰에서 초기화 함수를 호출합니다.
Richard Dalton

감사합니다. 두 번째 접근 방식은 뷰와 js 파일 간의 잘못된 결합이 아닙니까? 더 나은 방법이 있습니까?
gdoron 모니카 지원하고있다

둘 다 결합입니다. 렌더링하기 전에 js 파일을 처리하는 뷰 엔진을 작성하지 않는 한 분리 할 방법이 없습니다. 내 업데이트를 참조하십시오.
Aliostad 2011 년

제가 제안한이 방법은 어떻습니까? stackoverflow.com/questions/7902213/...
gdoron 모니카 지원하고있다

괜찮은 데요. 내 +1. 부분보기 또는 전체보기는 아무것도 변경하지 않습니다. 그것은 모두 js와 결합 뷰입니다.
Aliostad 2011 년

7

@변수를 .js 파일로 가져 오려면 전역 변수를 사용하고 해당 .js 파일을 사용하는 mvc보기에서 해당 변수의 값을 설정해야합니다.

JavaScript 파일 :

var myValue;

function myFunc() {
  alert(myValue);
}

MVC보기 파일 :

<script language="text/javascript">
    myValue = @myValueFromModel;
</script>

뷰에 의해 값이 설정된 후에 함수에 대한 호출이 발생하는지 확인하십시오.


1
myValue를 매개 변수로 함수에 직접 전달하는 것은 어떻습니까? 나는 globals에 의존하는 것보다 param을 사용하여 명시 적으로 호출하는 것을 선호하지만, 나는 자바 스크립트에 그다지 열중하지 않으므로 global을 갖는 중요한 측면을 놓칠 수 있습니다.
BigMike

@BigMike : 물론 허용됩니다. 위에서 설명한 방법은 단순히 여러 함수에서 동시에 변수를 사용할 수 있도록하지만 매개 변수를 사용하는 것도 좋습니다.
Joel Etherton 2011 년

설명해 주셔서 감사합니다. 모델의 일종의 js 객체 버전을 자동으로 갖는 것이 좋을 것입니다 (모델 클래스의 속성을 통해 훌륭 할 것입니다). 이것은 패턴과 완전한 네임 스페이스 인식 변수 솔루션을 추가합니다. 큰 문제는 브라우저로 전송 된 생성 된 html에 코드를 삽입하는 방법 일 것입니다 (<script> 태그를 통해 직접). 현재 프로젝트가 끝나는대로 몇 가지 실험을 할 것 같습니다.
BigMike

@BigMike : DataContractJsonSerializer 클래스 ( msdn.microsoft.com/en-us/library/… )를 사용하면 매우 쉽게 수행 할 수 있습니다 . 뷰로 파싱 할 수있는 클래스의 JSON 버전을 생성합니다.
Joel Etherton 2011 년

4

아마도 이것은 올바른 접근 방식이 아닙니다. 관심사 분리 고려. 수업 data injector에 가 있어야하며 JavaScript대부분의 경우 데이터는 JSON.

script폴더에 JS 파일을 만들고이 참조를View

<script src="@Url.Content("~/Scripts/yourJsFile.js")" type="text/javascript"></script>

이제 JavaScript리터럴 클래스를 고려 하십시오 yourJsFile.js.

var contentSetter = {
    allData: {},
    loadData: function (data) {
        contentSetter.allData = eval('(' + data + ')');
    },
    setContentA: function () {
        $("#contentA").html(allData.contentAData);
    },
    setContentB: function () {
        $("#contentB").html(allData.contentAData);
    }
};

또한 클래스 선언

public class ContentData
{
    public string ContentDataA { get; set }
    public string ContentDataB { get; set }
}

이제 다음을 Action수행하십시오.

public ActionResult Index() {
    var contentData = new ContentData();
    contentData.ContentDataA = "Hello";
    contentData.ContentDataB = "World";
    ViewData.Add("contentData", contentData);
}

그리고 당신의 관점에서 :

<div id="contentA"></div>
<div id="contentB"></div>

<script type="text/javascript">
    contentSetter.loadData('@Json.Encode((ContentData) ViewData["contentData"])');
    contentSetter.setContentA();
    contentSetter.setContentB();
</script>

좋은! 하지만 너무 복잡한 것 같아요 ... 내 대답에 대해 어떻게 생각하세요? stackoverflow.com/questions/7902213/... . 그건 그렇고 당신이 contentAData를 쓴 setContentB에 복사 붙여 넣기 오류가 있습니다. 감사!
gdoron 모니카 지원하고있다

1
@gdoron 저를 믿으세요, JS 수업을 관리하고 분리를 고려하는 것은 거대한 프로젝트가있을 때 생명을 구하는 것입니다
Abdul Munim 11


2

나는 일반적으로 모델 속성에 대한 액세스가 필요한 JS를 함수로 래핑 한 다음 뷰에서 @something을 전달합니다. 예를 들면

<script type="text/javascript">
function MyFunction(somethingPresentInTheView) {
  alert(somethingPresentInTheView);
}
</script>

보기에서 다음을 통해 함수 호출을 추가합니다 (예제).

<input type='button' onclick="MyFunction('@Model.PropertyNeeded')" />

1

나는 당신이 그 JS 코드를 View에 넣어야한다고 생각합니다. 내가 아는 한 Razor 파서는 .js 파일을 보지 @않으므로 사용하는 모든 것이 작동하지 않습니다. PLus, 당신이 발견했듯이, 자바 스크립트 자체는이 @문자를 좋아하지 않습니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.