私は現在 CMS システムを作成していますが、以下が機能しないことがわかりました。
まったく理想的ではなく、汚いと感じる回避策があります。私は今のところそれで大丈夫で、別のアプローチにはあまり興味がありません(しかし、それで答えを止めさせないでください)。私が求めているのは、なぜそれが機能しないのかについての何らかの説明です - それは ASP.NET MVC のバグですか?
説明するのは難しいので、私のコード (毛羽立ちを除いて) に話させます...意味があることを願っています!
編集:コンパイラは2番目のマスターページの「継承」属性を完全に無視しているようです-質問の下部を参照してください。
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' の定義が含まれておらず、タイプ 'object' の最初の引数を受け入れる拡張メソッド 'ContentItem' が見つかりませんでした (using ディレクティブまたはアセンブリ参照がありませんか?)
しかし、私がそのように変更すると、すべてうまく機能し、ダンディになります。
Content.Master - ContentViewData オブジェクトのプロパティを参照しようとするのではなく、モデル全体 (ContentViewData オブジェクト) を RenderPartial() に渡していることに注意してください。
<%@ 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 %>" />
<% } %>
ええ、それは機能しますが、アリバイにはなりません。
前もって感謝します、チャールズ。
編集:興味深いことに、コンパイラは 2 番目のマスター ページの「継承」属性を完全に無視しているようです。
例えば。私はこれを行うことができますが、それでも問題なくコンパイルされます...
<%@ Master
Language="C#"
MasterPageFile="~/Views/Shared/Site.Master"
Inherits="System.Web.Mvc.ViewMasterPage<ThisDoesntExist.AtAll>" %>