Html.Partial不渲染局部视图

时间:2014-06-27 09:20:54

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

我在视图中有以下代码:

@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")

它会正确显示产品。任何人都可以告诉我两个版本之间有什么区别,因为我花了很长时间才弄清楚为什么产品没有展示

2 个答案:

答案 0 :(得分:13)

实际上是razor语法告诉我们我们开始编写c#代码,如果你不把 @ 它被认为是纯文本,那么你需要把 @ < / strong>在视图中编写c#代码之前签名,在html帮助方法中你不需要在前面加分号,然后以这种方式编写助手的剃刀语法。

例如:

@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");
}

正确的方法是告诉这是一个剃刀html助手和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/

答案 1 :(得分:1)

简单地说,“@”符号指示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")

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