Razor에서 메소드를 어떻게 정의합니까?


213

Razor에서 메소드를 어떻게 정의합니까?


1
옵션이 무엇인지보고자하는 사람들을 위해 : 두 가지 방법이 있습니다. 하나. "@function"을 사용하고 다른 하나는 "@helper"를 사용합니다. 이들의 차이점은 여기에 잘 설명되어 있습니다. mikesdotnetting.com/article/173/…
b1k

답변:


310

@functions 는 언제 ( 어쩌면 ) 언제해야하는지에 대한 논쟁을 떠나는 방법입니다.

@functions {

    // Add code here.

}

16
+1 감사합니다. 실용성이라고합니다. MVC는 도시에서 유일한 게임이 아닙니다. MVC와 같은 간단한 면도기 및 URLRewrite를 좋아하는 사람들은 IMO에 거의 도움이되지 않습니다.
Jason Sebring

5
@functions뷰 특정 생성 코드 를 구성하기에 좋은 장소 입니다. 적절한 예 : 그 추한 클라이언트 템플릿 -에서 - 문자열 ..
user2864740

1
안녕 데이비드, 어떻게 한 파일에서 함수를 정의하고 다른 파일에서 사용할 수 있습니까?
Georgi Kovachev

Georgi, 이것을 "Razor HTML Helper"라고합니다. 기본적으로 여기에 제안 된 정적 메소드 세트를 사용하여 코드 폴더에 정의 된 클래스 : asp.net/mvc/overview/older-versions-1/views/…
jeanie77

Georgi, 지금 까지이 문제를 겪었을 수도 있지만 ... <code> @functions </ code> 또는 <code> @helper </ code> 면도기 옵션을 재사용하기 위해 App_Code에서 Shared.cshtml과 같은 파일을 사용할 수 있습니다 폴더. 여기에서 <code> @functions {} </ code> 또는 <code> @helper MyFunction () {} </ code>을 정의하고 <code> @ Shared.MyFunction () <과 같은 다른 Razor 템플릿에서 사용할 수 있습니다. / code> 여기서 파일 이름은 "네임 스페이스"와 같습니다.
Jamie Altizer

194

인라인 도우미를 의미합니까?

@helper SayHello(string name)
{
    <div>Hello @name</div>
}

@SayHello("John")

4
MvcHtmlString이 아니라 C # 형식을 반환하는 메서드를 정의하고 싶습니다.
Rookian

4
@Rookian, 왜 C # 코드를 작성해야합니까? 나는 관점에서 메소드를 작성하는 것이 잘못되었다는 것을 의미합니다! 어디에서든 C # 코드를 완벽하게 작성한 다음 Razor보기에서 메소드를 호출 할 수 있습니다. 바로 이것이 HTML 도우미가하는 일입니다. 그리고 항상 MvcHtmlString을 반환하지는 않습니다.
Darin Dimitrov

1
@ 루키아, 어쩌면 당신이 무엇을하려고하는지 설명 할 수 있습니다. 그것이 무엇이든간에 C # 코드를 작성하는 것보다 더 좋은 방법이 있다고 확신합니다 :-)
Darin Dimitrov

1
대단해! 감사합니다 Darin ... MVC에 대한 모든 것을 알고 있다고 생각 될 때, 여러분은 함께 와서 새로운 것을 배웁니다. :)
Serj Sagan

3
ASP.NET 코어와 동등한 태그 도우미는 docs.microsoft.com/en-us/aspnet/core/mvc/views/tag-helpers/…
beercohol입니다.

34

면도기 내부에 함수를 정의하는 것은 매우 간단합니다.

@functions {

    public static HtmlString OrderedList(IEnumerable<string> items)
    { }
}

어디서나 함수를 호출 할 수 있습니다. 처럼

@Functions.OrderedList(new[] { "Blue", "Red", "Green" })

그러나 이와 동일한 작업을 수행 할 수도 있습니다 helper. 예로서

@helper OrderedList(IEnumerable<string> items){
    <ol>
        @foreach(var item in items){
            <li>@item</li>
        }
    </ol>
}

차이점은 무엇입니까 ?? 이 이전에 따르면 @helpers와 @functions는 공통점이 한 가지를 공유합니다. 웹 페이지 내에서 코드 재사용이 가능합니다. 그들은 또 다른 공통점을 공유합니다-언뜻보기에 동일하게 보이므로 역할에 약간의 혼란을 초래할 수 있습니다. 그러나 그것들은 동일하지 않습니다. 본질적으로 도우미는 메서드로 노출 된 재사용 가능한 Razor sytnax의 스 니펫이며 HTML을 브라우저에 렌더링하기위한 반면 함수는 웹 페이지 응용 프로그램 내 어디에서나 호출 할 수있는 정적 유틸리티 메서드입니다. 헬퍼의 리턴 유형은 항상 HelperResult 인 반면 함수의 리턴 유형은 원하는 유형입니다.


2
.netcore에서 @Functions접두사를 생략하여 함수 호출 @OrderedList(...)
Muflix

12

이와 같은 Func으로도 할 수 있습니다.

@{
    var getStyle = new Func<int, int, string>((width, margin) => string.Format("width: {0}px; margin: {1}px;", width, margin));
}

<div style="@getStyle(50, 2)"></div>

10

면도기는 단지 템플릿 엔진입니다.

정규 수업을 만들어야합니다.

Razor 페이지 내부에서 메소드를 작성하려면 @functions블록에 넣습니다 .


1

면도기 블록에서 로컬 함수 로 간단히 선언 할 수 있습니다 (예 :) @{}.

@{
    int Add(int x, int y)
    {
        return x + y;
    }
}

<div class="container">
    <p>
        @Add(2, 5)
    </p>
</div>

0

또한 바로 사용할 수있는 @{ }기능을 만들 블록 :

@{
    async Task<string> MyAsyncString(string input)
    {
        return Task.FromResult(input);
    }
}

그런 다음 나중에 면도기 페이지에서 :

   <div>@(await MyAsyncString("weee").ConfigureAwait(false))</div>

0

MyModelVm.cs

public class MyModelVm
{
    public HttpStatusCode StatusCode { get; set; }
}

Index.cshtml

@model MyNamespace.MyModelVm
@functions
{
    string GetErrorMessage()
    {
        var isNotFound = Model.StatusCode == HttpStatusCode.NotFound;
        string errorMessage;
        if (isNotFound)
        {
            errorMessage = Resources.NotFoundMessage;
        }
        else
        {
            errorMessage = Resources.GeneralErrorMessage
        }

        return errorMessage;
    }
}

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