2012-10-11 5 views
5

既存のカミソリセクションにHTMLコードを追加することはできますか?既存のカミソリセクションにHTMLコードを追加する

以下

は私のシナリオです:

マイ_layout.cshtmlはこのようなものが含ま: - :

@RenderSection("BottomSection", required: false) 

とビューのいずれかで_article.cshtmlを、私は以下のようなセクションが定義されています

@section BottomSection 
{ 
<script src='~/Scripts/module/article_details.js' type='text/javascript'></script> 
<script src='~/Scripts/module/modal.js' type='text/javascript'></script> 
@MvcHtmlString.Create(Model.ExtraStuff) 
} 

であり、上記のビューで使用される_counter.cshtmlという名前の部分ビューです。同じセクション、つまりBottomSectionにさらにHTMLコードを追加したいと思います。

私は部分図で再びBottomSectionセクションを宣言しようとした:

@section BottomSection{ 
<text>More data</text> 
} 

しかし、それは働いていませんでした。

これを達成する方法はありますか?MVC 4の既に定義されたカミソリセクションに動的にコードを追加しますか? 部分ビューでは、親ビュー/モデルからのデータは必要ありません。 そして、.NET Framework 4.0/VS2010でMVC 4を使用しています。

答えて

-3

Ajaxを使用すると、パーシャルビューをロードしてターゲット部門でレンダリングできます。

はjqueryのAJAXに

 $.ajax({ 
      type: 'GET', 
      url: '@Url.Action("Action","Controller")', 
      cache: false, 
      timeout: 20000, 
      contentType: "application/json; charset=utf-8", 
      success: function (_results) { 
       $("#TargetDiv").html(_results); 
      }, 
      error: function (_results) { 

      } 
     }); 
+0

このソリューションは間違っている理由を教えてください。私は、既にレンダリングされたビューに新たに生成されたhtmlを追加するために同じことを試みました – amesh

+0

あなたにお返事ありがとうございますが、これは私がしたかったものではありません。部分的なビューでは、より多くのコンテンツ/スクリプト参照などを追加することができます。データを取得すると、往復のリクエストが追加され、それまでのページは機能しません。 – Kay

-2

を使用してみてくださいたぶん私はあなたの質問を理解しないが、あなたは、ネストされた部分的なビューを使用していけない理由は?例えば

PartialView1

`<script src='~/Scripts/module/article_details.js' type='text/javascript'></script> 
<script src='~/Scripts/module/modal.js' type='text/javascript'></script> 
@MvcHtmlString.Create(Model.ExtraStuff) 
@{Html.RenderPartial("PartialView2",Model.ExtraStuff);}` 

PartialView2

`<text>More data</text>` 
+0

複数の部分ビューを持つと、問題が解決されます。しかし、これは私のために多くの部分的なビューファイルを持ってしまうことになり、動的アプローチの目的を無視してしまいます。 – Kay

0

私は(実際に私は自分自身ことを知っていただきたいと思います)のセクションにコンテンツを追加する方法がわかりません、私は同様の結果を生むかもしれないトリックを知っています。セクションを使用する代わりに、TempDataを使用できます。 TempDataはViewBagとよく似ていますが、変数が設定されると、現在のユーザーがそれに再度アクセスしようとするまでそこに存在します(現在のユーザーのためにいくつかの連続した要求があるため、余分な注意が必要です)。以下はその使用方法の例です。レイアウトで

:部分図で

@{ 
    var bottomSection = (string)TempData["BottomSection"]; 
    if (bottomSection == null) 
    { 
     bottomSection = ""; 
    } 
    bottomSection += "<script src='~/Scripts/module/article_details.js' type='text/javascript'></script>\n"; 
    bottomSection += "<script src='~/Scripts/module/modal.js' type='text/javascript'></script>\n"; 
    bottomSection += Model.ExtraStuff + "\n"; 
    TempData["BottomSection"] = bottomSection; 
} 

:鑑み

@Html.Raw(new MvcHtmlString((string)TempData["BottomSection"])); 

@{ 
    var bottomSection = (string)TempData["BottomSection"]; 
    if (bottomSection == null) 
    { 
     bottomSection = ""; 
    } 
    bottomSection += "More data"; 
    TempData["BottomSection"] = bottomSection; 
} 

これはさらに、それらの擬似セクションのためのヘルパーを書き込むことによって改善することができますまたはセクションの内容を別々の部分的な部分(下を見てください)に移動します。

bottomSection += Html.Partial("_StuffToAddToSection").ToString(); 

ヘルパークラス:

public static class PseudoSectionsHelper 
{ 
    public static MvcHtmlString AppendToPseudoSection<T>(this TempDataDictionary TempData, string sectionName, T model, Func<T, HelperResult> content, bool addNewLineCharacter = true) 
     where T : class 
    { 
     return AppendToPseudoSection(TempData, sectionName, content(model).ToString(), addNewLineCharacter); 
    } 

    public static MvcHtmlString AppendToPseudoSection(this TempDataDictionary TempData, string sectionName, MvcHtmlString content, bool addNewLineCharacter = true) 
    { 
     return AppendToPseudoSection(TempData, sectionName, content.ToString(), addNewLineCharacter); 
    } 

    public static MvcHtmlString AppendToPseudoSection(this TempDataDictionary TempData, string sectionName, string content, bool addNewLineCharacter = true) 
    { 
     var section = (string)TempData[sectionName]; 
     if (section == null) 
     { 
      section = ""; 
     } 
     else if (addNewLineCharacter) 
     { 
      section += "\n"; 
     } 
     section += content; 
     TempData[sectionName] = section; 
     // We return empty MvcHtmlString to be able to use this helper inline (without declaring code block @{ some code... } in view) 
     return new MvcHtmlString(""); 
    } 

    public static MvcHtmlString PseudoSection(this TempDataDictionary TempData, string sectionName) 
    { 
     var section = (string)TempData[sectionName]; 
     return new MvcHtmlString(section); 
    } 
} 

使用例

レイアウトの追加:鑑み

@TempData.PseudoSection("BottomSection") 

@TempData.AppendToPseudoSection("BottomSection", Model, @<text> 
    <script src='~/Scripts/module/article_details.js' type='text/javascript'></script> 
    <script src='~/Scripts/module/modal.js' type='text/javascript'></script> 
    @MvcHtmlString.Create(Model.ExtraStuff) 
</text>) 

または

@{ 
    TempData.AppendToPseudoSection("BottomSection", Model, @<text> 
     <script src='~/Scripts/module/article_details.js' type='text/javascript'></script> 
     <script src='~/Scripts/module/modal.js' type='text/javascript'></script> 
     @MvcHtmlString.Create(Model.ExtraStuff) 
    </text>); 
} 

あるいは

@TempData.AppendToPseudoSection("BottomSection", Html.Partial("BottomSectionScriptsAndStuff")) 

と部分で:

@TempData.AppendToPseudoSection("BottomSection", "More data") 
+0

TempDataの代わりにSystem.Web.HttpContext.Current.Itemsを使用すると、TempDataは読んでいない限り生き延びる可能性があります。これは奇妙な状況につながる可能性があります(レンダリングしなかったセクションあるページでは、別のページにレンダリングされます)。 – jahu

関連する問題