6

HTML コードを既存のかみそりセクションに追加することは可能ですか?

以下は私のシナリオです:

私の _layout.cshtml には次のようなものが含まれています。

@RenderSection("BottomSection", required: false)

そして、ビューの1つである_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 を使用しています。

4

3 に答える 3

0

セクションに要素を追加する方法はわかりません (実際、自分で知りたいのですが) が、同様の結果が得られる可能性のあるトリックは知っています。セクションを使用する代わりに、TempData を使用できます。TempData は ViewBag によく似ていますが、変数が設定されると、現在のユーザーが再度アクセスしようとするまでそこに存在します (現在のユーザーのいくつかの連続した要求を通じて存在する可能性があるため、特別な注意が必要です)。以下は、その使用方法の例です。

レイアウト:

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

ビューで:

@{
    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;
}

部分ビュー:

@{
    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")
于 2015-04-20T13:35:09.350 に答える
-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>`
于 2012-10-18T09:31:13.863 に答える
-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) {

            }
        });
于 2012-10-11T10:12:29.330 に答える