剃刀表现得很奇怪?

时间:2011-07-01 15:39:36

标签: asp.net-mvc-3 razor partial-views

Razor正在和我玩耍。我有一个部分观点:

@model ManageMvc.Models.Default.Classes.MvcModule           
@{
    if (Model.CanExpand)
    {
        Response.Write("Crazy");
        @:TEST
        <text>ojiiojjiojiojiojiojiojiojio</text>
        Response.Write("Crazy2");
    }
    else
    {
        Response.Write("Crazy");
        @:TEST
        <text>ssssssssdffffffff</text>
        Response.Write("Crazy2");
    }
}

这是从这个调用的:

@if (Model.Modules.Count > 0)
{
    for (var i = 0; i < Model.Modules.Count; i++)
    {
        Html.Partial("~/Views/UserControls/_MenuItem.cshtml", Model.Modules[i]);
    }
    ....
}

我希望razor打印出Text块和@:块中写的内容。但我一无所获。当我运行它时,它只打印CrazyCrazy2(对于列表中的每个模块)。 我错过了什么吗?

更新

调用if(Model.Modules.Count&gt; 0)的代码本身就是部分代码。那个是从布局页面调用的。所以顶部代码是被调用的第二个部分。这会有什么不同吗?

布局 - &gt; MainMenu(部分) - &gt; CreateMenuItem(部分)

更新

这是新代码:(_MenuItem.cshtml在Shared-&gt; DisplayTemplates中)

@model ManageMvc.Models.Default.Classes.MvcModule          
@{
    if (Model.CanExpand)
    {
        @:TEST
        <text>ojiiojjiojiojiojiojiojiojio</text>
    }
    else
    {
        @:TEST
        <text>ssssssssdffffffff</text>        
    }
}

正在调用菜单项的部分视图MainMenu:

@Html.DisplayFor(x => x.Modules, "_MenuItem")

现在这打破了该行,我收到以下错误:

传递到字典中的模型项的类型为'System.Collections.Generic.List`1 [ManageMvc.Models.Default.Classes.MvcModule]',但此字典需要类型为'ManageMvc.Models的模型项。 Default.Classes.MvcModule”。

1 个答案:

答案 0 :(得分:0)

在调用@帮助程序时放置Html.Partial并避免在ASP.NET MVC视图中使用Response.Write

for (var i = 0; i < Model.Modules.Count; i++)
{
    @Html.Partial("~/Views/UserControls/_MenuItem.cshtml", Model.Modules[i]);
}

除了写一些丑陋的循环外,我强烈建议你使用模板化助手。因此,使用这个简单的帮助器替换布局中的for循环:

@Html.DisplayFor(x => x.Modules)

然后定义将为~/Views/Shared/DisplayTemplates/MvcModule.cshtml集合的每个元素呈现的显示模板(Modules):

@model ManageMvc.Models.Default.Classes.MvcModule           
@if (Model.CanExpand)
{
    @:TEST
    <text>ojiiojjiojiojiojiojiojiojio</text>
}
else
{
    @:TEST
    <text>ssssssssdffffffff</text>
}

看看这有多容易?