繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM