将 HTML 代码附加到现有的 Razor 部分

Posted

技术标签:

【中文标题】将 HTML 代码附加到现有的 Razor 部分【英文标题】:Append HTML code to a existing Razor section 【发布时间】:2012-10-01 23:02:17 【问题描述】:

是否可以将 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 的局部视图中,上面的视图使用了该视图;我想将更多 HTML 代码添加到同一部分,即 BottomSection。

我尝试在局部视图中再次声明 BottomSection 部分:

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

但它没有成功。

有什么方法可以实现这一点 - 将更多代码动态附加到 MVC 4 中已定义的 razor 部分? 请注意,部分视图不需要来自父视图/模型的任何数据。 我正在将 MVC 4 与 .Net Framework 4.0/VS2010 一起使用。

【问题讨论】:

【参考方案1】:

我不知道如何将内容附加到部分(实际上我自己也想知道),但我知道一个可能会产生类似结果的技巧。可以使用 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")

【讨论】:

使用 System.Web.HttpContext.Current.Items 代替 TempData 可能是一个更好的主意,因为只要您不阅读 TempData 就可以生存,这可能会导致奇怪的情况(例如您没有在一个页面上呈现的部分,在另一个页面上呈现)。【参考方案2】:

也许我不明白你的问题,但你为什么不使用嵌套的局部视图???

例如:

部分视图1

`<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 );`

部分视图2

`<text>More data</text>`

【讨论】:

拥有多个局部视图将解决该问题。但是,这最终会为我提供很多部分视图文件 - 违背了动态方法的目的。【参考方案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) 

            
        );

【讨论】:

请告诉为什么这个解决方案是错误的。我已经尝试将新生成的 html 附加到已经渲染的视图中 感谢您的回复,但这不是我想做的。部分视图可以添加更多内容/脚本引用等。获取数据将添加往返请求,直到那时我的页面将无法正常工作!

以上是关于将 HTML 代码附加到现有的 Razor 部分的主要内容,如果未能解决你的问题,请参考以下文章

如何将指标附加到现有的 Lambda 日志组?

无法将熊猫数据框附加到现有的 Excel 工作表

使用 Groovy 将 json 附加到现有的 json 文件中

如何使用 Vue.js 将 DataTable() 与数组中的数据(v-for 循环)附加到现有的 HTML <table>?

附加到现有的json文件

如何将绘图附加到现有的 pdf 文件