【问题标题】:How to make intellisense works with RazorEngine?如何使智能感知与 RazorEngine 一起使用?
【发布时间】:2015-01-07 20:25:21
【问题描述】:

我正在尝试配置 RazorEngine,以便智能感知在视图上工作。我使用 nuget 添加 RazorEngine 和 Microsoft.AspNet.Mvc。我创建了 TestView.cshtml 并声明了@model MyModel,但它说的是The name 'model' does not exist in the current context。我也不能在视图中使用智能感知。

我错过了这里的任何步骤吗?如何在 View 中开启智能感知?

【问题讨论】:

  • 你能举个例子吗(我怀疑你应该使用Model,而不是model
  • 您是否偶然通过类库进行扩展?只是好奇。
  • 这实际上是模型声明的正确语法。不过,它随后被称为使用 @Model。什么版本的 MVC?
  • @markpsmith 我使用 MVC 5.1.0 和 .NET Framework 4.5。
  • @Anonymous,如果您要使用 @{ var someValue = model.SomeProperty; } 之类的内容,则会显示该错误,在这种情况下,它需要是 Model.SomeProperty(大写 M)

标签: c# asp.net .net asp.net-mvc razorengine


【解决方案1】:

你可以使用

@using RazorEngine.Templating
@using Namespace.Of.My.Model
@inherits TemplateBase<MyModel>

在模板的顶部。

这适用于使用 Visual Studio 2013 的新控制台应用程序(添加对 RazorEngine 的引用后)。 这方面的文档是here

编辑:

我注意到这仅在将 RazorEngine 项目添加到解决方案并直接引用时才有效。如果您使用 NuGet 包,您还需要确保以下其中一项才能使其正常工作:

  1. 您的项目输出路径设置为bin\,而不是bin\Debug\bin\Release\
  2. RazorEngine.dllSystem.Web.Razor.dll 复制到bin\

【讨论】:

  • 但我需要使用@inherits RazorEngine.Templating.TemplateBase。第一个 using 语句对我不起作用。
  • 将输出移动到bin 文件夹是可行的,但有人能解释一下原因吗?
  • @jtate 我的假设是这是在 Visual Studio 设计器中硬编码的。
【解决方案2】:

哦,我在将 Razor Engine 添加到我的自定义 dll 项目时遇到了这样的问题。要解决这个问题,您必须:

1.在 web 配置文件中正确设置命名空间(希望你在视图文件夹中有它,如果没有 - 从 MVC 项目复制):

 <system.web.webPages.razor>
 <host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=5.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" />       
    <add namespace="System.Web.Optimization" />
  </namespaces>
</pages>
</system.web.webPages.razor>
...

2.用于构建bin\路径(不是任何其他,您可以使用复制后构建命令将结果移动到另一个地方)

3.clean 解决方案并删除 objbin 文件夹,而不是构建

我的视图代码从@model MyModelClass 开始,一切正常

【讨论】:

    【解决方案3】:

    我知道这个问题有点老了。无论解决方案如何,我都无法工作。 我有一个 hack 修复程序,可能对某些人来说是可口的。我不是很喜欢它,但它是我迄今为止得到的最有用的东西。

    诀窍是自己将“模型”定义为来自实际模型的变量。我将它定义为“TrueModel”,但是你能想到的任何名称都不会与“model”或“Model”冲突。然后只需用“TrueModel”替换所有“Model”实例。

    @using Namespace.To.My.Models
    @* This line should still look like an error, 
       but we only really care about the intellisense in the rest of the .cshtml file. *@
    @{ ModelType TrueModel = (ModelType)Model; }
    
    <div>
    @TrueModel.MyProperty is here now.
    </div>
    <p> @TrueModel.MyOtherProperty is great! </p>
    

    这不是一个很好的解决方案,但它可能很有用。

    【讨论】:

    • 嗨@Zachary Dow,这对我不起作用,我在文件夹 Model 下有一个名为 EmailModel 的模型,我在 Templates 下有一个名为 EmailTemplate 的 HTML 模板。我写了@{ EmailModel TrueModel = (EmailModel)EmailModel; },这不起作用
    • 你能帮帮我吗
    • @ManojKalluri 首先“这不起作用”并没有告诉我太多。其次,“模型”是 MVC 中的一个特殊属性。因此,您可能希望将其更改为如下所示:@{ EmailModel TrueModel = (EmailModel)Model; }
    • 谢谢,其实这不是 MVC 项目。这是一个 DLL,此 DLL 将在控制台应用程序中引用。我想使用 razoreengine 发送电子邮件,我需要从 cshtml 获取电子邮件正文
    • 谢谢.. 这对我有用.. 我只需要将“RazorEngine.dll”和“System.Web.Razor.dll”文件复制到“bin”目录而不是“bin” \调试\”和砰!它工作..
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-07
    • 1970-01-01
    • 2013-12-30
    • 2015-02-25
    • 1970-01-01
    相关资源
    最近更新 更多