【问题标题】:Html.Partial not rendering partial viewHtml.Partial 不呈现局部视图
【发布时间】:2014-08-18 08:27:37
【问题描述】:

我在一个视图中有以下代码:

@if (SiteSession.SubPageHelper.DisplayType == DisplayType.List)
{
    Html.Partial("_SubLandingPage_List");
}
else
{
    Html.Partial("_SubLandingPage_Grid");
}

在部分中,我只有一个这样的 foreach 循环:

@foreach (Product product in SiteSession.SubPageHelper.PagedProducts)
{
      some html code here
}

PagedProducts 是通过对缓存的产品列表执行 .Take() 得到的

现在上面的代码不会显示我的分页产品,但是如果我将部分更改为包含 at 符号,请删除分号:

@Html.Partial("_SubLandingPage_Grid")

它将正确显示产品。谁能告诉我这两个版本之间的区别是什么,因为我花了很长时间才弄清楚为什么产品没有显示

【问题讨论】:

    标签: asp.net-mvc-4 razor asp.net-mvc-partialview


    【解决方案1】:

    实际上是剃刀语法告诉我们开始编写c#代码,如果你不放@,它将被视为纯文本,所以你需要放@ 在视图中和 html 辅助方法中编写 c# 代码之前先签名,您不需要在前面放分号,然后以这种方式编写辅助方法是剃刀语法。

    例如:

    @Html.LabelFor(x=>m.SomeProperty) // here @ is telling that we are writing c# statement
    

    当你写作时:

    @if (SiteSession.SubPageHelper.DisplayType == DisplayType.List)
    {
        Html.Partial("_SubLandingPage_List"); // this is wrong syntax 
    }
    else
    {
        Html.Partial("_SubLandingPage_Grid");
    }
    

    正确的方法是告诉这是一个razor html helper和c#语句:

    @if (SiteSession.SubPageHelper.DisplayType == DisplayType.List)
    {
        @Html.Partial("_SubLandingPage_List")
    }
    else
    {
        @Html.Partial("_SubLandingPage_Grid")
    }
    

    你可以看到更多关于剃刀语法HERE

    更多链接可以帮助您了解剃须刀:

    http://www.asp.net/web-pages/tutorials/basics/2-introduction-to-asp-net-web-programming-using-the-razor-syntax

    http://weblogs.asp.net/scottgu/asp-net-mvc-3-razor-s-and-lt-text-gt-syntax

    http://weblogs.asp.net/scottgu/introducing-razor

    更新:

    另一种方法是使用 RenderPartial,它可以在 if 语句中使用,而无需放置 @ 符号:

    @if (SiteSession.SubPageHelper.DisplayType == DisplayType.List)
        {
            Html.RenderPartial("_SubLandingPage_List");
        }
        else
        {
            Html.RenderPartial("_SubLandingPage_Grid");
        }
    

    要了解Html.PartialHtml.RenderPartial 之间的区别,请访问以下链接:

    Html.Partial vs Html.RenderPartial & Html.Action vs Html.RenderAction

    http://dotnethelpers.wordpress.com/2013/06/18/difference-between-html-renderpartial-vs-html-partial-and-html-renderaction-vs-html-action-in-mvc/

    http://www.em64t.net/2010/12/razor-html-renderpartial-vs-html-partial-html-renderaction-vs-html-action-what-one-should-use/

    【讨论】:

    • 但如果它被认为是纯文本,那么为什么不呈现在屏幕上而不是什么都没有。此外,当我调试并单步执行代码时,它仍然进入部分代码,但产品集合中没有任何内容
    • razor 语法是将@ 放在其语句的末尾,并且不需要分号,您应该阅读有关 razor 语法以清楚如何使用它
    • 啊,好吧,你几乎是正确的 - 它仍然被认为是 c# 而不是纯文本,因为它在 if 语句中是这样的,你需要使用 HTML.RenderPartial("_SubLandingPage_List");。通过将@ 放在前面,它会回到 Razor,在这种情况下,HTML.Partial 足以渲染它。如果您更改答案以反映这一点,我会接受它
    • Html.Partial 不返回主视图中的局部视图??
    【解决方案2】:

    简单地说,“@”符号指示 Razor 它必须渲染一些东西。 @ 总是期望从提供的语句中打印一些东西。 如果您不想使用此语法,您仍然可以在循环中对代码进行细微更改来呈现内容.. 看看这个。

    @if (SiteSession.SubPageHelper.DisplayType == DisplayType.List)
    {
        Html.RenderPartial("_SubLandingPage_List"); // this is wrong syntax 
    }
    else
    {
        Html.RenderPartial("_SubLandingPage_Grid");
    }
    

    Html.RenderPartial 将直接将其写入流,不需要@。 即使您尝试编写类似以下的内容

    @Html.RenderPartial("_SubLandingPage_Grid")
    

    这会给你一个错误,因为 @expect 会返回一些东西,Html.RenderPartial 返回 void

    【讨论】:

    • 这个问题也可以通过在Html.Partial调用前加上@: @来解决
    • 是的,这个问题可以通过添加@来解决。但我只是在向他解释“@”的行为:) 和另一种增加知识的解决方案.. 因为到目前为止这不是剃须刀的奇怪行为......干杯;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-24
    • 2016-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-04
    相关资源
    最近更新 更多