我目前正在创建一个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>" %>
答案 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; 放入母版页的代码中,然后使用强类型模型属性