2011-01-03 46 views
19

ASPNET.MVC Razorでカスタムコントロールを使用するにはどうすればよいですか?ASP.NET MVC Razorのカスタムコントロール

Razorビューでカスタムコントロールを使用したいと思います。例えば:

<mycontrols:something>@Model.MyVar</mycontrols:something> 

または

<mycontrols:something myattribute="@Model.MyVar" /> 

は、私の目標は、唯一の些細なrepetiveのUI詰め込むために、MvcControl由来わずか数のコントロールを使用することであることに注意してください。

@Registerと似た構文を見つけようとしましたが、ビューの一番上に書きますが、成功しませんでした。

は、その後、私は

<pages> 
    <controls> 
     <add tagPrefix="mycontrols" namespace="mynamespace" assembly="myassembly"/> 
    </controls> 
</pages> 

を追加し、web.configファイルに行ってきましたが、カスタムコントロールをレンダリングでは無視されているように見えます。

誰かが助けることができますか?

...ちょっと古いファッションかもしれませんが、時にはカスタムコントロールがコードクリーナーを作成するのに役立つこともあります。

+0

他の人はここにいるが、間違ったアプローチをしている。あなたが剃刀、そして実際には一般的にMVCで望むことをやるためのより良い方法があります。 –

答えて

10

ASP.NETでは、MVCカスタムサーバーコントロールを使用しないでください。それらのほとんどは、ViewStateとPostBackに依存しています。これは、MVCに存在しなくなった概念です。再利用可能な機能を実装するには、テンプレート、HTMLヘルパーを使用する方がよいでしょう。コントロールのもう1つの問題は、大部分が、どこかからデータを取り出してそれをレンダリングするいくつかのビジネスロジックをカプセル化することです。これは反MVCパターンです。 MVCでは、モデルを操作してデータをフェッチし、ビューモデルを単に表示するビューに渡すのはコントローラの責任です。

+0

私はそれを知っていますが、私はMvcControlsから派生したコントロールを使用するつもりです。 – Fabrizio

+0

* MvcControls *とはどういう意味ですか? –

+0

MvcFuturesアセンブリの名前空間Microsoft.Web.Mvc.ControlsにMvcControlクラスから派生したコントロールを実装することを意味します。 – Fabrizio

6

MVCは、部分的な見解ではなく、カスタムコントロールを使用して、彼らはカスタムコントロールを行うことができますほとんどすべてをカバーする2つの方法で使用することができ、既にページコントローラによって取得したデータをレンダリングする

  • れるrenderPartial
  • 似ているが独自のコントローラアクションを持っているため、独立してデータを取得できる

mvcビューにカスタムコントロールを配置する価値があると思う唯一のシナリオは、作業している場合です部分的に移行されたWebフォームプロジェクトであり、WebFormsViewEngine以外のものではうまくいかないのだろうか。

19

Razor構文は、コントロールの概念をまったくサポートしていません。コントロールを使用する場合は、ASPX(WebForms)構文を使用する必要があります。

しかし、推奨されるMVCパターンは、HTMLヘルパー関数または部分ビューを使用することです。 Razorでは、簡易ヘルパー機能のために@helper構文を使用することもできます。

+0

「ASPXの構文」は誤解を招く可能性があることに注意することが重要だと思います。 ASPXビューエンジンを使用してASP.NET MVCでサーバーコントロールを使用する方法を尋ねる人々の質問を見ました。しかし、はい、あなたの答えは正しいです! –

1

私はそれをすることはできますが、私はそれをお勧めしませんが、私はここで判断するのではありません。私はポストバックとビューの状態がどちらかの作業を続けるとは思っていませんが、htmlのすべてをレンダリングすることはできます。

剃刀はWebformsビューエンジンコントロールをサポートしていないため、これを行う唯一の方法は少しハックです。ただし、Webforms Viewエンジンで行われた部分的なビューはサポートされています。だから、ハックソリューションは、そのようにして、あなたのコントロールとの部分図を含めることです。例えば

、あなたはmvc3プロジェクトにおけるオフィスのWeb UIリボンを使用したいと言う、あなたは

<body> 
    <div> 
     @Html.Partial("_RibbonPartial") 
    </div> 
</body> 
を含むことによって、そうでした表示されるのは

です。

はその後、その後、あなたが必要とするあなたの部分図で単にあなたのコントロールとセットにrunat =「server」を使用してにrunat =「サーバー」

//_Ribbon.aspx 
<form id="form1" runat="server"> 
    <XyzControls:Manager ID="Manager1" runat="server" UITheme="Silver" /> 
    <XyzControls:OfficeRibbon ID="OfficeRibbon1" runat="server" ApplicationMenuColor="#267c29" 
     ApplicationMenuText="Item" ApplicationMenuType="Backstage"> 
//... rest of control code 
</form> 

で、フォームの中に置く.aspxの_Ribbonは型である場合にはポストバックを使用する代わりにajaxを使用してイベントを実装する

次に、クリーンアップするために、生成されたコードをwebformsビューエンジンから取り除いて、必要のないポストバックを得てください。あなたはそれを保つようにすることができます。何も起こりません。

$(function() 
{ 
    // we don't need any of the webforms stuff 
    $("#__EVENTTARGET","#aspnetForm").parents("div:first").remove(); 
    $("#__EVENTVALIDATION","#aspnetForm").parents("div:first").remove(); 
}); 
1

私は同じ需要を持っていた:私はあなたが本当に厄介なハックものに取得したい場合にも偽のビューステートを持っている、しかし、あなたは、次のjQueryを使用することができるWebフォームから余分なコードを削除する方法があります知っています。 Razor/MVCページからカスタムWebコントロールを使用したい1つはコントロールで、つまりポストバックを処理することではありません。あなたはそれをサポートするイベントサイクルを持っていませんが、あなたの唯一の要求が「レンダリングコントロール」を使用することであれば、それをかんぬきでインスタンス化して、レンダリングの場所を制御できます:

@{ 
    var myControl = new mycontrols.something(); 
    myControl.myattribute = Model.MyVar; 
    mycontrol.RenderControl(new HtmlTextWriter(this.Output)); 
} 
関連する問題