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

时间:2009-05-30 03:17:56

标签: c# asp.net-mvc master-pages viewdata

我目前正在创建一个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:'object'不包含'ContentItem'的定义,没有   扩展方法'ContentItem'   接受第一个类型的参数   可以找到'对象'(是你吗?   缺少使用指令或   装配参考?)

但如果我这样改变,那一切都很好,花花公子。

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 %>" />
<% } %>

所以,是的,这有效,但它不是alibi。

提前致谢, 查尔斯。

编辑:有趣的是,似乎编译器完全忽略了第二个母版页的'inherits'属性。

EG。我可以做到这一点,它仍然无需投诉即可编译......

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

3 个答案:

答案 0 :(得分:1)

有趣......一个合理的猜测是,由于与嵌套母版页的某些交互,你的ContentViewData对象正在被转发到BaseViewData(如果确实如此,那么其他人需要权衡其原因)。

你可以验证这个:

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

您的解决方法“有效”的原因是因为您为ContentViewData键入了部分视图,因此当您传入模型时,它会向下转换为该类型。

答案 1 :(得分:0)

从编辑中可以看出,编译器似乎完全忽略了嵌套母版页的'inherits'属性。

这让我相信ASP.NET MVC中的嵌套母版将始终从它的父母版页继承,正如我所见,完全忽略了inherits属性。

编辑:这里肯定会有一些魔力......如果我删除'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>" %>

确实很奇怪。

答案 2 :(得分:0)

试着做下一件事:

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

不要问任何问题,只是尝试将&lt;%= string.Empty%&gt; 放入母版页的代码中,然后使用强类型模型属性