2017-05-22 5 views
2

これはMVCの原則とベストプラクティスに違反することを認識しています。オーチャードのリソースをHtmlHelperに登録することはできますか?

私は一組のカスタムアングルコンポーネントを用意しています。各コンポーネントには、オプションのパラメータがたくさんあり、それぞれに異なるリモートスタイルシートとjavascriptファイルが必要です。これらをHtmlHelperでレンダリングしたいのですが、手動で適切なリソースを使用する必要はありません。

私は、これはトリックを行うだろうと期待していたが、それは私がヘルパーのようなものとして、任意の形状を使用することができ

public static class HtmlExtensions 
{ 
    private static IResourceManager _resourceManager; 

    // Executed in the Activated method of an OrchardShellEvents implementation 
    public static void SetResourceManager(IResourceManager resourceManager) 
    { 
     _resourceManager = resourceManager; 
    } 

    public static MvcHtmlString Angular(this HtmlHelper helper, CustomAngularComponent component) 
    { 
     // Require the resources 
     var _styleRegister = new ResourceRegister(helper.ViewDataContainer, _resourceManager, "Style"); 
     var _scriptRegister = new ResourceRegister(helper.ViewDataContainer, _resourceManager, "Script"); 

     _styleRegister.Require(component.StyleSheet).AtHead(); 

     if (!string.IsNullOrEmpty(component.Script)) 
     { 
      _scriptRegister.Require(component.Script).AtFoot(); 
     } 

     // Create tag 
     var tag = new TagBuilder(component.Tag); 
     tag.MergeAttributes(component.Parameters); 

     return new MvcHtmlString(tag.ToString(TagRenderMode.SelfClosing)); 
    } 
} 

ない:

@Display(New.Angular(Model: new CustomAngularComponent(...))) 

が、強く持つヘルパー型付きのパラメータはもっと良く感じられます。

+0

てみ '「スタイル」' 'に「スタイル」'と '「スクリプト」'に '「スクリプト」' ... – ViRuSTriNiTy

+0

@ViRuSTriNiTyはその方向に私を指してくれてありがとう。 'ResourceRegister'の深いところで、' 'stylesheet" 'と' 'script" 'キーが正しい基底パスを構築することを期待していることがわかりました。ファイルはまだページに含まれていません。おそらく、HtmlHelperからインクルードを含むシェイプを返す方法を理解する方が簡単かもしれません。 – Lawyerson

答えて

0

This commentオーチャードの別の質問で私を指摘しました。実際にはWork<IResourceManager>を注入してそれを直接使用するだけでセットアップ作業ができました。これはMVCのベストプラクティスに準拠していないことに注意してください。これにより、メンテナンス性が犠牲になって読みやすくなります。変更する

public static class HtmlExtensions 
{ 
    private static Work<IResourceManager> _resourceManager; 

    // Executed in the Activated method of an OrchardShellEvents implementation 
    public static void SetResourceManager(Work<IResourceManager> resourceManager) 
    { 
     _resourceManager = resourceManager; 
    } 

    public static MvcHtmlString Angular(this HtmlHelper helper, CustomAngularComponent component) 
    { 
     // Require the resources 
     _resourceManager.Value.Require("stylesheet", component.StyleSheet).AtHead(); 

     if (!string.IsNullOrEmpty(component.Script)) 
     { 
      _resourceManager.Value.Require("script", component.Script).AtFoot(); 
     } 

     // Create tag 
     var tag = new TagBuilder(component.Tag); 
     tag.MergeAttributes(component.Parameters); 

     return new MvcHtmlString(tag.ToString(TagRenderMode.SelfClosing)); 
    } 
} 
関連する問題