代码之家  ›  专栏  ›  技术社区  ›  Charlino

强类型母版页多态性-嵌套母版页忽略继承属性

  •  1
  • Charlino  · 技术社区  · 16 年前

    我目前正在创建一个CMS系统,发现以下内容不起作用。

    这很难解释,所以我会让我的代码(减去很多绒毛)来说话。。。希望它有意义!

    编辑: 编译器似乎完全忽略了第二个母版页的“inherits”属性——请参见问题的底部。

    -请注意,它继承自

    public class ContentViewData : BaseViewData
    {
        public MyCMS.Data.Models.Content ContentItem { get; set; }
    }
    

    地点,主人 BaseViewData

    <%@ Master
        Language="C#"
        Inherits="System.Web.Mvc.ViewMasterPage<MyCMS.WebSite.ViewData.BaseViewData>" %>
    

    内容大师 -请注意类型为的强类型viewdata 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.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”的定义,并且没有 接受类型为的第一个参数 找不到“对象”(您是吗 装配参考?)

    内容大师 -请注意,我将整个模型(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 -请注意,将强类型viewdata从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 %>" />
    <% } %>
    

    所以,是的,这是有效的,但它不去不在场证明。

    提前感谢,, 查尔斯。

    编辑:

    我能做到这一点,但它仍然可以毫无怨言地编译。。。

    <%@ Master
        Language="C#"
        MasterPageFile="~/Views/Shared/Site.Master"
        Inherits="System.Web.Mvc.ViewMasterPage<ThisDoesntExist.AtAll>" %>
    
    3 回复  |  直到 16 年前
        1
  •  1
  •   JSeverson JSeverson    16 年前

    有趣的是……一个合理的猜测是,由于与嵌套母版页的某些交互,您的ContentViewData对象正在向上转换为BaseViewData(如果确实是这样,则需要其他人说明原因)。

    <% Html.RenderPartial("ContentItemImage", ((MyCMS.WebSite.ViewData.ContentViewData)Model).ContentItem); %>
    

    解决方案“起作用”的原因是您的局部视图是为ContentViewData类型化的,所以当您传入模型时,它会向下转换为该类型。

        2
  •  0
  •   Charlino    16 年前

    从我的编辑中可以看到,编译器似乎完全忽略了嵌套母版页的“继承”属性。

    不起作用

    <%@ Master
        Language="C#"
        MasterPageFile="~/Views/Shared/Site.Master" %>
    

    行得通

    <%@ Master
        Language="C#"
        MasterPageFile="~/Views/Shared/Site.Master"
        Inherits="Sysasfdaasdtem.Web.Mvsdfc.ViewMasterPage<ThisDoesntExist.AtAll>" %>
    

    的确很奇怪。

        3
  •  0
  •   s8k    16 年前

    <%@ 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); %>
    

    <%=字符串。空%> 在母版页的代码中,然后使用强类型 模型 所有物