4

对不起,很长的问题。我把它分成三个问题,可以单独阅读。如果你能帮我解决一个问题,请做!

我有一个 Razor 引擎的自定义实现。所有作品和模板都经过编译,可以使用。手头有一些实现,它涉及具有通用Model属性的基类,该属性允许强类型视图(模板)。在这一点上,我使用@inherits指令来定义基类,它是泛型类型。

GVS 在这里给出的答案(Hosting the Razor View engine using a view model),他说 using@model实际上是简写,@inherits Class<ModelType>让我认为两者可以互换,但事实并非如此。

这是我的模板

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

}
<h1>@Model.TestProperty

愿望清单

  1. 删除@inherits指令
  2. 添加@model指令

问题


当前情况:一切都可以编译并且可以使用模板。但是,我在@inherits指令中有一个智能感知错误。:

没有为扩展“.cshtml”注册 buildprovider。您可以在 machine.config 或 web.config 中注册一个。

这里有什么问题?

我在视图文件夹中有一个 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属性对 Visual Studio 不可见,因此导致错误 =>答案/解决方案是实现愿望清单#2?


使用愿望清单#2: 添加@model指令会引发智能感知错误@Model.TestProperty(即使将@inherits指令留在原处......):

当前上下文中不存在名称模型。

额外信息:

我正在使用以下代码从已编译的程序集中实例化模板。

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. @model指令是 MVC 独有的
    您需要使用MvcRazorEngineHost.

于 2011-05-10T14:16:00.720 回答