1

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

我确实有一个不太理想的解决方法,而且感觉很脏。我现在对此很满意,并且对不同的方法并不真正感兴趣(但不要让它阻止你回答)。我所追求的是某种关于它为什么不起作用的解释——它是 ASP.NET MVC 中的一个错误吗?

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

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

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

内容项目图像.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”的定义,并且找不到接受“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 %>" />
<% } %>

所以,是的,这行得通,但它不是不在场证明。

在此先感谢,查尔斯。

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

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

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

3 回答 3

1

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

你可以验证尝试这个:

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

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

于 2009-05-30T05:23:34.943 回答
0

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

这使我相信 ASP.NET MVC 中的嵌套母版页将始终从其父母版页继承,并且正如我所见证的那样,完全忽略了继承属性。

编辑:这里一定有一些魔法......如果我删除'inherits'属性,它将无法编译,因为它不知道 HtmlHelper 类。但是,如果我在那里有“继承”属性,里面有垃圾,它确实可以编译。

不工作

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

有用吗

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

确实很奇怪。

于 2009-06-01T03:20:33.473 回答
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); %>

不要问任何东西,只需尝试将<%= string.Empty %>放入您的母版页代码中,然后使用您的强类型Model属性。

于 2009-11-16T00:02:57.753 回答