母版页和页面中的嵌入式代码块

时间:2009-09-23 10:50:01

标签: asp.net-mvc master-pages

嗯,我有些困惑!

'简单问题'

根据ContentPlaceHolder是否为空,我想要以不同方式呈现我母版页的部分内容。

所以:

我有一个母版页,如某些代码:

<% if (ContentPlaceHolder1.HasControls()) {%>
    <div id="LittleDiv">
<% } else { %>
    <div id="BigDiv">
<% } %>
        some text
    </div>

<% if (ContentPlaceHolder1.HasControls()) {%>
    <div id="Div1">
         yadda yadda yadda
         [<asp:ContentPlaceHolder ID="ContentPlaceHolder1" runat="server"/>]
         blah blah blah
    </div>
<% } %>

我的页面有一些代码:

<asp:Content ID="Content1" runat="server" contentplaceholderid="ContentPlaceHolder1">
   <% if (Model.SomeValue) { %>
       hello! 
   <% } %>
</asp:Content>

(注意:对于每个内容占位符,示例页面的嵌入代码块中的逻辑对于每个页面可能是唯一的!)

这看起来不错,但它不起作用。 问题是我看到的(警告我可能完全错了!)。嵌入式代码块在对象Render中进行评估。直观地说,页面似乎可以控制主人。因此,在页面渲染之前调用母版页的渲染。这意味着母版页始终可以看到页面内容控件中的内容。

这周围有一个很好的方式吗? (我有一点解决方案,但它是一个可怕的黑客!我不会发布它因为我不想影响思考。)

3 个答案:

答案 0 :(得分:1)

好的,这是另一个想法:)。而不是将逻辑放在母版页中......

<% if (ContentPlaceHolder1.HasControls()) {%>
    <div id="LittleDiv">
<% } else { %>
    <div id="BigDiv">
<% } %>
        some text
    </div>

为什么不为它创建一个占位符? e.g。

<asp:ContentPlaceHolder ID="LittleBigDivPlaceHolder" runat="server" />

然后,您可以允许具体的非母版页面来决定内容。您还可以通过将逻辑移动到部分视图中来避免重复自己,该部分视图可能会被您的不同视图参数化。

答案 1 :(得分:0)

您的母版页可以检查ViewData字典的内容并从那里运行其逻辑,而不是查找结果控件吗?

答案 2 :(得分:0)

或者,您可以使用javascript来显示/隐藏客户端上的div。