cshtml 템플릿에서 함수를 만드는 방법은 무엇입니까?


219

하나의 cshtml 파일에만 필요한 함수를 만들어야합니다. 내 상황을 ASP.NET 페이지 메서드로 생각할 수 있습니다. ASP.NET 페이지 메서드는 페이지에 구현 된 최소 웹 서비스입니다. 한 페이지로 범위가 지정되어 있기 때문입니다. HTML 도우미 (확장 방법)에 대해 알고 있지만 하나의 cshtml 파일에 함수가 필요합니다. 뷰 내에서 함수 서명을 만드는 방법을 모르겠습니다. 참고 : Razor 템플릿 엔진을 사용하고 있습니다.

답변:


279

@helper Razor 지시문을 사용할 수 있습니다.

@helper WelcomeMessage(string username)
{
    <p>Welcome, @username.</p>
}

그런 다음 다음과 같이 호출하십시오.

@WelcomeMessage("John Smith")

13
@functions메소드 안에 태그를 넣을 수 없으므로이 답변이 마음에 듭니다.
jfren484

1
예, 이것은 함수를 선언하는 것보다 훨씬 낫습니다. 훨씬 더 직설적입니다.
muglio

2
그러나 변수를 반환 할 수 없습니다 (따라서 단어 기능)
Paul

@Paul 나는 당신이 그 말의 의미를 이해하지 못합니다.
Daniel Liuzzi

2
asp.net 코어는 @helper도 지원합니까?
MuM6oJuM6o

411

왜 cshtml 파일 안에 그 함수를 선언하지 않습니까?

@functions{
    public string GetSomeString(){
        return string.Empty;
    }
}

<h2>index</h2>
@GetSomeString()

32
@functions 지시어가 OP 요구 사항을 구체적으로 충족하므로이 정보를 답으로 표시해야합니다. 헬퍼 기능은 @helper 지시문이있는 파일을 App_Code 디렉토리에 저장하여 여러 템플리트 파일에서 공유 사용하도록 고안되었습니다. @functions 지시문은 함수를 선언하는 템플릿에서만 함수를 사용할 수 있도록합니다.
Jon Davis

7
또한 도우미는 다른 면도기 도우미와 마찬가지로 문자열을 반환하는 데 중점을 두므로 functions솔루션은 반환 유형에 더 많은 유연성을 제공합니다. 두 가지 답변 모두 유용한 정보이지만 유용한 정보이므로 내 책에서 +1을 얻습니다.
AaronLS

8
@AaronLS 공평하게, 도우미는 문자열을 반환하지 않고 IHtmlString을 반환합니다. IHtmlString은 HTML 인코딩을 처리하고 XSS 공격으로부터 앱을 보호합니다. 헬퍼는 또한 헬퍼 자체에서 Razor 구문의 편의성을 제공합니다. 즉, <p>Welcome, @username.</p>return new HtmlString("<p>Welcome, " + Html.Encode(username) + ".</p>");.
Daniel Liuzzi

9
그러나 @helper단일 뷰에서 사용한다고해서 다른 뷰에서 사용할 수는 없습니다. @helper를 더 좋아하는 이유는 중괄호 사이에 html을 넣을 수 있기 때문입니다. @functions(쉽게) 그렇게 할 수 없습니다.
jfren484

5
그냥 기록을 위해 : 모두 @helper@functions많은 전망을 공유 할 수 있고, 둘 다에 선언 된 단일 뷰에서 사용할 수있는 (그리고 나는 개인적으로 모두 공유 / 하나의 시나리오에서 그들을 위해 사용을 발견했다). 그들 사이의 실질적인 차이점은 뷰 헬퍼가 렌더링 된 HTML 스 니펫 (또는 더 적절한 HelperResult인스턴스) 을 반환하기 위해 구문 설탕을 추가 하는 반면 뷰 함수는 일반적 으로 간단한 참조 또는 값 유형을 반환하는 데만 유용하다는 것입니다.
rsenna

25

메소드가 HTML을 반환 할 필요가 없으며 다른 작업을 수행 해야하는 경우 Razor에서 도우미 메소드 대신 람다를 사용할 수 있습니다

@{
    ViewBag.Title = "Index";
    Layout = "~/Views/Shared/_Layout.cshtml";

    Func<int,int,int> Sum = (a, b) => a + b;
}

<h2>Index</h2>

@Sum(3,4)

3
작동하지만 단순 성과는 거리가 멀다. 나의 거룩한 책은 단순하다;). 그러나 대안을 제공해 주셔서 감사합니다.
Saeed Neamati

함수에서 페이지의 전역 변수에 액세스 해야하는 경우 다른 방법이 있습니까? : /
Alexandre Daubricourt


1

페이지의 전역 변수에 액세스하려면 다음을 수행하십시오.

@{
    ViewData["Title"] = "Home Page";

    var LoadingButtons = Model.ToDictionary(person => person, person => false);

    string GetLoadingState (string person) => LoadingButtons[person] ? "is-loading" : string.Empty;
}

C # 7.0부터는 이것이 정답입니다. GetLoadingState()여기에 로컬 기능이 있습니다.
Wolfrevo Cats
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.