1

私は現在 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>" %>
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属性は完全に無視されると私は信じています。

編集:ここで何か魔法が起こっているに違いありません...'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>" %>

確かに非常に奇妙です。

于 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 に答える