好的,我有一个母版页,其中包含一个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标记。
因此有没有人知道这两种方法或任何其他指针之间的渲染差异? 提前谢谢。
答案 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代码会更容易!