web-dev-qa-db-ja.com

ASP.NET Coreの@helperの代替

これまでのところ、ViewComponentTagHelperも解決しないとは思いません。これに代わるものはありますか?パラメータを受け取り、HtmlStringを返すもの

私は何も有害ではないと思います:

@helper foo(string something) {
     <div>Say @something</div>
}

var emailbody = classfilenameinAppCodefolder.foo("hello"); //store result in a variable for further processes

今のところ、RCの前に一時的に削除すると思います。 https://github.com/aspnet/Razor/issues/281 および https://github.com/aspnet/Mvc/issues/11 まあ!それが良いです。私は誰かがそれに取り組んでいることを望みます。 @helperがないと、大きなHtmlStringまたは「テンプレート」を作成するのは大変なことです。

注:パーシャルビューではうまくいかないようです。ビューをレンダリングするだけで、ビューを変数に戻すことはないと思います。

次に、App_Codeフォルダーはどうなりましたか?

40
Ifeanyi Chukwu
@{
    Func<String, IHtmlContent> foo = @<div>Say @item</div>;
}
16
Alexaku

@Alexakuの答えを拡張して、関数のようなヘルパーを実装した方法を示したいと思います。 1つの特定のページでのみ役立ちますが、入力パラメーターを使用してかみそりのコードを複数回実行できます。構文はすばらしいものではありませんが、かみそりの@helper関数がない場合は非常に便利です。最初に、関数への入力パラメーターを含む何らかのDtoを宣言します。

@functions {
   private class Dto
   {
      public string Data { get;set; }
   }
}

次に、かみそり関数を宣言します。 displayItemの値は複数行にすることができ、@ itemを使用してDto変数にアクセスすることにも注意してください。

@{
   Func<Dto, IHtmlContent> displayItem = @<span>@item.Data</span>;
}

次に、かみそりテンプレートを使用する場合、ページのどこからでも次のように呼び出すことができます。

<div>
   @displayItem(new Dto {Data = "testingData1" });
</div>
<div>
   @displayItem(new Dto {Data = "testingData2" });
</div>
9
Gary Brunton

次のGithubの問題によると、@ helperが戻ってきて、asp .net core 3.0.0 preview 4に含まれるようです。

https://github.com/aspnet/AspNetCore/issues/511

[〜#〜]更新[〜#〜]

Asp .netコア3から、Razorコードブロック内でローカル関数を定義できるようになりました。

@{
    void RenderName(string name)
    {
        <p>Name: <strong>@name</strong></p>
    }

    RenderName("Mahatma Gandhi");
    RenderName("Martin Luther King, Jr.");
}

https://docs.Microsoft.com/en-us/aspnet/core/mvc/views/razor?view=aspnetcore-3.1#razor-code-blocks

または、次のように@functionsディレクティブを使用できます。

@{
    RenderName("Mahatma Gandhi");
    RenderName("Martin Luther King, Jr.");
}

@functions {
    private void RenderName(string name)
    {
        <p>Name: <strong>@name</strong></p>
    }
}

https://docs.Microsoft.com/en-us/aspnet/core/mvc/views/razor?view=aspnetcore-3.1#functions

5
Gary Brunton

@helperディレクティブ 削除されました 不完全であり、現在の設計が新しい「ASP.NET 5の方法」に適合しなかったためです。理由の1つは、ASP.NET 5のヘルパーをApp_Codeフォルダーで宣言する必要があることです 特別なフォルダーの概念はありません 。したがって、チームは一時的に機能を削除することを決定しました。

ただし、将来的には戻す予定です。 this および this を参照してください。

4
Henk Mollema

その「機能」は、ViewComponent(および必要に応じてTagHelper)に簡単に置き換えることができます。 ASP.NET CoreはWebデザイナーにとってはるかに使いやすく、ViewComponentsを使用すると、かみそりのコード(ほとんどない)なしでHTMLを記述できます。

例えば:

  1. SayComponent : ViewComponentクラスを作成します。

    public class SayComponent : ViewComponent
    {
        public void Render(string message)
        {
            return View(message);
        }
    }
    
  2. Views/Shared/Say/Default.cshtmlの下にViewファイルを作成します。

    @model string
    
    <div>Message: @Model.</div>
    
  3. そしてそれを呼び出す:

    @await Component.RenderAsync("Say", "some message")
    

より快適にご利用いただくために、これを_ViewImports.cshtmlファイルに追加してください:

@addTagHelper *, YourSolutionName

そして、あなたはそれをタグヘルパーとして使うことができます:

<vc:say message="some message"></vc:say>
3

.NET Core 3の場合、ローカル関数を使用できます。

@{
    void RenderName(string name)
    {
        <p>Name: <strong>@name</strong></p>
    }

    RenderName("Mahatma Gandhi");
    RenderName("Martin Luther King, Jr.");
}

https://docs.Microsoft.com/en-us/aspnet/core/mvc/views/razor?view=aspnetcore-3.1#razor-code-blocks

3
Scott