@関数@helpers
asp.net mvc 3のほとんどのヘルパーは、System.Web.Mvcクラスの拡張メソッドです。 HtmlHelper。
ただし、1つのビューで必要な2〜3個のヘルパー用に個別の静的クラスを作成することは必ずしも便利ではありません。 また、大量のhtmlコードブロックを返すヘルパーを作成するのは非常に不便です。構文の強調表示、インテリジェンス、その他の利点はありません。
Razorには、これらの問題を解決する2つの優れたブロックがあります。 これらを使用すると、ヘルパーを.cshtmlファイルに直接作成できます。
@Functionsブロック
Razorページは、System.Web.Mvcから継承されたクラスです。 WebViewPage <TModel>。 通常、htmlコードを生成するvoid Execute()メソッドのみが使用されます
@functionsブロックを使用すると、独自のメソッド、プロパティ、フィールドなどを追加できます。
@functions
{
string HelloWorld()
{
return "Hello world" ;
}
string Now
{
get { return DateTime .Now.ToString( "dd MMMM" ); }
}
class SomeClass
{
...
}
}
このアプローチにより、コードを大幅に簡素化できます。 ある列挙型があるとしましょう:
enum State
{
Created,
ProcessingStage1,
ProcessingStage2,
Accepted,
Rejected
}
ステータスに応じて、異なる画像とフレームの色が必要です。
@functions
{
enum State
{
Created,
ProcessingStage1,
ProcessingStage2,
Accepted,
Rejected
}
string GetStateImg( State state)
{
switch (state)
{
case State .Created:
return "created.png" ;
case State .ProcessingStage1:
case State .ProcessingStage2:
return "processing.png" ;
case State .Accepted:
return "accepted.png" ;
case State .Rejected:
return "rejected.png" ;
default :
return "" ;
}
}
string GetStateBorderColor( State state)
{
switch (state)
{
case State .Accepted:
return "green" ;
case State .Rejected:
return "red" ;
default :
return "yellow" ;
}
}
public static int SomeFunc( int a, int b)
{
return a + b;
}
}
その結果、これを行う機会が得られます。
< div class ="border @(GetStateBorderColor(State.Accepted))" >
< img src ="~/images/@(GetStateImg(State.Accepted))" />
...
</ div >
もちろん、 GetStateImgメソッドとGetStateBorderColorメソッドは、.csコード内のある種のヘルパークラスに移動できますが、同じビュー内の1つのビューだけに必要なヘルパーを保持する方がはるかに論理的です。
@Helpersブロック
@functionsブロックにはわずかな欠点があります。このブロックにはクラスの通常の関数/プロパティを含める必要があるため、Razorのすべての喜びを利用して関数の本体にhtmlを挿入することはできません。
このタスクには@helpersブロックが使用されます。
ヘルパーの宣言:
@helper Email( string address, string name = null)
{
< a href ="mailto:@(address)" > @(name ?? address) </ a >
}
@Email( "google@gmail.ru" )
を使用します
そして最も素晴らしい
よく使用されるヘルパーと関数を1つの.cshtmlファイルに収集し、 Helpers.cshtmlなどの名前を付けて、 AppCodeに入れてから、次のように表示することができます。
@ Helpers .Email( "some state" )
PS、もちろん、他のクラスから使用できるように、メソッドはパブリックで静的でなければなりません