渲染html.RenderPartial和<%@ register之间的差异

时间:2010-07-20 09:07:07

标签: asp.net-mvc-2

好的,我有一个母版页,其中包含一个ascx ...

<%@ register tagname="header" tagprefix="vb" src="~/Views/Controls/Header/Header.ascx" %>

<vb:header id="pageHeader" runat="server" />

ascx有一个使用MvcSiteMapProvider ...

的站点地图
<asp:SiteMapDataSource id="SiteMapDataSource1" sitemapprovider="Secure" showstartingnode="false" runat="server" />
<asp:menu id="headerMenu" DataSourceID="siteMap" orientation="Horizontal" staticenabledefaultpopoutimage="false" runat="server" IncludeStyleBlock="false"></asp:menu>        

一切正常,然后我需要将模型传递给控件,​​因此将主页更改为

html.RenderPartial("~/Views/Controls/Header/Header.ascx", Model)

现在我收到运行时错误“类型为'Menu'的Control'2_headerMenu'必须放在带有runat = server的表单标签内。”是的我在母版页中有一个带有runat = server的Form标记。

因此有没有人知道这两种方法或任何其他指针之间的渲染差异? 提前谢谢。

4 个答案:

答案 0 :(得分:0)

尽量不要使用相对路径,而只使用部分视图的名称

html.RenderPartial("Header", Model);

现在,另一个重点是指定您在局部视图中使用的对象类型。第一行应该是:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<OBJECT-TYPE>" %>

用对象类型替换OBJECT-TYPE。

答案 1 :(得分:0)

没想到MVC会自动在该目录中找到ascx吗?

是的,确定Control已正确设置并加载OK,直到它尝试渲染asp:menu

答案 2 :(得分:0)

一位评论员注意到的问题是你在MVC视图中混合了一个WebForm控件。作为您接收状态的错误,菜单必须位于<form runat="server"/>控件的子控件层次结构中。诸如Html.RenderPartial之类的MVC助手不对控制树做任何事情。理想情况下,您不应混合使用MVC和WebForms控件。它可以在某些情况下起作用,但在其他情况下则失败。

答案 3 :(得分:0)

我遇到同样的麻烦!刚刚发布了这样的问题!在我看来,部分呈现页面不知道父页面,这就是为什么你得到一个int而不是父页面的地址!

如果您想生成静态ClientID,可以在.NET 4中使用此功能!知道值不会改变,编写JavaScript代码会更容易!

相关问题