[英]Strongly typed master pages polymorphism - nested masterpages ignore inherit attribute
我当前正在创建CMS系统,发现以下内容不起作用。
我确实有一个工作不太理想,感觉很脏。 我现在很酷,对另一种方法并不十分感兴趣(但不要让这种情况阻止您回答)。 我所要解决的是为什么它不起作用的某种解释-它是ASP.NET MVC中的错误吗?
很难解释,所以我让我的代码(减去大量的绒毛)开始讨论……希望这样做有意义!
编辑:似乎编译器完全忽略了第二个母版页的'inherits'属性-请参阅问题底部。
ContentViewData.cs-注意它是从BaseViewData继承的
public class ContentViewData : BaseViewData
{
public MyCMS.Data.Models.Content ContentItem { get; set; }
}
Site.Master-注意类型为BaseViewData的强类型视图数据
<%@ Master
Language="C#"
Inherits="System.Web.Mvc.ViewMasterPage<MyCMS.WebSite.ViewData.BaseViewData>" %>
Content.Master-注意类型为ContentViewData的强类型视图数据,并且它是Site.Master的子母版这一事实
<%@ Master
Language="C#"
MasterPageFile="~/Views/Shared/Site.Master"
Inherits="System.Web.Mvc.ViewMasterPage<MyCMS.WebSite.ViewData.ContentViewData>" %>
...blah blah blah...
<% Html.RenderPartial("ContentItemImage", Model.ContentItem); %>
ContentItemImage.ascx
<%@ Control
Language="C#"
Inherits="System.Web.Mvc.ViewUserControl<MyCMS.Data.Models.Content>" %>
<% if (Model.HasPrimaryPhoto)
{ %>
<img src="/content/photos/<%= Model.GetPrimaryPhoto.ThumbFileName %>"
title="<%= Model.GetPrimaryPhoto.Caption %>" />
<% } %>
现在在Content.Master内部,如果我尝试渲染ContentItemImage部分并像我一样引用ContentViewData对象的属性(特别是“ ContentItem”属性),请在下面重复。
<% Html.RenderPartial("ContentItemImage", Model.ContentItem); %>
如果跌倒在那条线上,并出现以下错误
编译错误
CS1061:“对象”不包含“ ContentItem”的定义,找不到找不到接受类型为“ object”的第一个参数的扩展方法“ ContentItem”(您是否缺少using指令或程序集引用?)
但是,如果我像这样改变一切,那么一切都很好,很花哨。
Content.Master-注意,我将整个模型(ContentViewData对象)传递给RenderPartial(),而不是尝试引用ContentViewData对象上的属性
<%@ Master
Language="C#"
MasterPageFile="~/Views/Shared/Site.Master"
Inherits="System.Web.Mvc.ViewMasterPage<MyCMS.WebSite.ViewData.ContentViewData>" %>
...blah blah blah...
<% Html.RenderPartial("ContentItemImage", Model); %>
ContentItemImage.ascx-注意将MyCMS.Data.Models.Content的强类型化视图数据更改为ContentViewData类。
<%@ Control
Language="C#"
Inherits="System.Web.Mvc.ViewUserControl<MyCMS.WebSite.ViewData.ContentViewData>" %>
<% if (Model.ContentItem.HasPrimaryPhoto)
{ %>
<img src="/content/photos/<%= Model.ContentItem.GetPrimaryPhoto.ThumbFileName %>"
title="<%= Model.ContentItem.GetPrimaryPhoto.Caption %>" />
<% } %>
是的,那行得通,但不是没有理由。
预先感谢,查尔斯。
编辑:有趣的是,似乎编译器完全忽略了第二个母版页的'inherits'属性。
例如。 我可以这样做,它仍然可以毫无抱怨地编译...
<%@ Master
Language="C#"
MasterPageFile="~/Views/Shared/Site.Master"
Inherits="System.Web.Mvc.ViewMasterPage<ThisDoesntExist.AtAll>" %>
有趣的...一个合理的猜测是,由于您与嵌套母版页发生了某些交互(因此,您的ContentViewData对象将被转换为BaseViewData(如果确实如此,则其他人将需要权衡其原因))。
您可以验证尝试这样做:
<% Html.RenderPartial("ContentItemImage", ((MyCMS.WebSite.ViewData.ContentViewData)Model).ContentItem); %>
解决方法“起作用”的原因是因为为ContentViewData输入了部分视图,因此当您传递Model时,它会向下转换为该类型。
只需尝试做下一件事:
<%@ Master
Language="C#"
MasterPageFile="~/Views/Shared/Site.Master"
Inherits="System.Web.Mvc.ViewMasterPage<MyCMS.WebSite.ViewData.ContentViewData>" %>
...blah blah blah...
<%= string.Empty %>
...blah blah blah...
<% Html.RenderPartial("ContentItemImage", Model.ContentItem); %>
不要问任何问题,只需尝试将<%= string.Empty%>放入母版页代码中,然后使用强类型的Model属性。
从编辑中可以看到,似乎编译器完全忽略了嵌套母版页的'inherits'属性。
这使我相信,ASP.NET MVC中的嵌套母版将始终从其父母版继承,并且据我所知,完全忽略了继承属性。
编辑:这里一定有一些不可思议的事情...如果我删除'inherits'属性,它将无法编译,因为它不了解HtmlHelper类。 但是,如果我在其中具有“ inherits”属性,并且内部有垃圾,它将进行编译。
不起作用
<%@ Master
Language="C#"
MasterPageFile="~/Views/Shared/Site.Master" %>
确实有效
<%@ Master
Language="C#"
MasterPageFile="~/Views/Shared/Site.Master"
Inherits="Sysasfdaasdtem.Web.Mvsdfc.ViewMasterPage<ThisDoesntExist.AtAll>" %>
确实很奇怪。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.