4

長い質問で申し訳ありません。私はそれを別々に読むことができる 3 つの問題に分けました。1 つの問題で私を助けることができる場合は、してください!

Razor エンジンのカスタム実装があります。すべての作品とテンプレートがコンパイルされ、使用できます。Model厳密に型指定されたビュー (テンプレート) を可能にするジェネリック プロパティを持つ基本クラスを含むいくつかの実装が手元にあります。この時点で、@inheritsディレクティブを使用してベースクラスを定義していますが、これはジェネリック型です。

ここで GVS が行った回答 ( Hosting the Razor View engine using a view model ) では、using@modelは実際には省略形であると述べているため@inherits Class<ModelType>、2 つを交換できると思いますが、そうではありません。

これは私のテンプレートです

@inherits RazorEngine.TemplateBase<MyProject.TestModel>
@functions {

}
<h1>@Model.TestProperty

ウィッシュリスト

  1. @inheritsディレクティブを削除します
  2. @modelディレクティブを追加する

問題


現状:全てコンパイル済みでテンプレートも使用可能。@inheritsただし、ディレクティブにインテリセンス エラーがあります。

拡張子「.cshtml」に登録されているビルドプロバイダーがありません。machine.config または web.config に登録できます。

ここで何が問題なのですか?

以下のように、views フォルダーに web.config があります。

<?xml version="1.0"?>
<configuration>

    <configSections>
        <sectionGroup name="system.web.webPages.razor" type="System.Web.WebPages.Razor.Configuration.RazorWebSectionGroup, System.Web.WebPages.Razor, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
            <section name="host" type="System.Web.WebPages.Razor.Configuration.HostSection, System.Web.WebPages.Razor, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" />
            <section name="pages" type="System.Web.WebPages.Razor.Configuration.RazorPagesSection, System.Web.WebPages.Razor, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" />
        </sectionGroup>
    </configSections>

    <system.web.webPages.razor>
        <host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
        <pages pageBaseType="System.Web.Mvc.WebViewPage">
            <namespaces>
                <add namespace="System.Web.Mvc" />
                <add namespace="System.Web.Mvc.Ajax" />
                <add namespace="System.Web.Mvc.Html" />
                <add namespace="System.Web.Routing" />
            </namespaces>
        </pages>
    </system.web.webPages.razor>

    <system.web>
        <compilation targetFramework="4.0">
            <assemblies>
                <add assembly="System.Web.Abstractions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
                <add assembly="System.Web.Routing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
                <add assembly="System.Data.Linq, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
                <add assembly="System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
            </assemblies>
        </compilation>
    </system.web>

</configuration>

ウィッシュリスト#1:@inheritsディレクティブを 削除すると、ベースクラスの.Modelプロパティがビジュアルスタジオに表示されなくなり、エラーが発生します=>答え/解決策はウィッシュリスト#2を実装することですか?


ウィッシュリスト#2:ディレクティブを 追加すると@model、インテリセンスエラーがスローされます@Model.TestProperty(ディレクティブをそのままにしておく場合でも@inherits...):

Model という名前は、現在のコンテキストには存在しません。

追加情報:

次のコードを使用して、コンパイル済みアセンブリからテンプレートをインスタンス化しています。

var template = (RazorTemplateBase<TModel>)Container.CompiledTemplates.CreateInstance("MyNamespace." + entry.TemplateName + "Template");
template.Model = model;
template.DataSource = dataSource;
template.Execute();
var output = template.Buffer.ToString();
template.Buffer.Clear();
return output;
4

1 に答える 1

1
  1. System.Web.WebPages.Razor.dll(in )への参照を追加できます<assemblies>
    に を登録しRazorBuildProviderます[PreApplicationStartMethod]

  2. ディレクティブは MVCに@model固有です。
    を使用する必要がありますMvcRazorEngineHost

于 2011-05-10T14:16:00.720 に答える