【问题标题】:Can't configure new assembly in self host application无法在自托管应用程序中配置新程序集
【发布时间】:2015-08-25 09:51:29
【问题描述】:

我在用 C# 编写的 Windows 窗体应用程序中使用 NancyFX 创建了一个新的自托管 Web 应用程序。我添加了 Razor 支持,并设法路由到 Razor 视图,没问题。我遇到的问题是当我尝试将一些数据绑定到页面时,传递给 View 一个 DataTable。 Nancy 抱怨它不能引用类型 System.ComponentModel.MarshalByValueComponent,因为项目中没有系统程序集。我阅读了很多关于在 app.config 中添加“剃刀”部分的文章,定义了我需要的组件和命名空间。但是当我尝试这样做时,当我尝试启动主机时出现另一个错误:

未处理的类型异常 Nancy.dll 中发生“Nancy.TinyIoc.TinyIoCResolutionException”

附加信息:无法解析类型: Nancy.ViewEngines.ViewEngineApplicationStartup

这是我的 app.config

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <sectionGroup name="system.web.webPages.razor" type="System.Web.WebPages.Razor.Configuration.RazorWebSectionGroup, System.Web.WebPages.Razor, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
      <section name="pages" type="System.Web.WebPages.Razor.Configuration.RazorPagesSection, System.Web.WebPages.Razor, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" />
      <section name="razor" type="Nancy.ViewEngines.Razor.RazorConfigurationSection, Nancy.ViewEngines.Razor" />
    </sectionGroup>
  </configSections>
  <appSettings>
    <add key="webPages:Enabled" value="false" />
  </appSettings>
  <system.web>
    <compilation debug="true" targetFramework="4.0">
      <assemblies>
        <add assembly="System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
      </assemblies>
    </compilation>
  </system.web>
  <system.web.webPages.razor>
    <pages pageBaseType="Nancy.ViewEngines.Razor.NancyRazorViewBase">
      <namespaces>
        <add namespace="Nancy.ViewEngines.Razor" />
        <add namespace="System" />
      </namespaces>
    </pages>
  </system.web.webPages.razor>

  <razor disableAutoIncludeModelNamespace="false">
    <assemblies>
      <add assembly="System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
    </assemblies>
    <namespaces>
      <add namespace="System" />
    </namespaces>
  </razor>
</configuration>

你能帮我解决这个问题吗?即使我阅读了所有这些帖子,我也找不到关于使用 Razor 支持进行自托管应用程序的真实示例。

【问题讨论】:

    标签: c# razor nancy


    【解决方案1】:

    我刚刚在 GitHub 中为您创建了一个存储库。 这是一个混合自托管和 Razor 的简单解决方案。

    检查是否是您搜索的内容: NancySelfHostRazorTest

    祝你好运。

    更新

    我能够复制您的错误,即使使用 Nancy.Hosting.Aspnet。这就是我要解决的问题:

    更改您的配置部分添加此行:

    <section name="razor" type="Nancy.ViewEngines.Razor.RazorConfigurationSection, Nancy.ViewEngines.Razor" />
    

    并在该部分下方添加以下内容:

    <razor disableAutoIncludeModelNamespace="false">
        <assemblies>
          <add assembly="System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
          <add assembly="System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
        </assemblies>
      </razor>
    

    最后你会得到这样的结果,基于我的 Web.Config:

      <configSections>
        <section name="razor" type="Nancy.ViewEngines.Razor.RazorConfigurationSection, Nancy.ViewEngines.Razor" />
        <sectionGroup name="system.web.webPages.razor" type="System.Web.WebPages.Razor.Configuration.RazorWebSectionGroup, System.Web.WebPages.Razor, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
          <section name="pages" type="System.Web.WebPages.Razor.Configuration.RazorPagesSection, System.Web.WebPages.Razor, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" />
        </sectionGroup>
      </configSections>
      <razor disableAutoIncludeModelNamespace="false">
        <assemblies>
          <add assembly="System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
          <add assembly="System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
        </assemblies>
      </razor>
    

    在视图中,尝试一下like this

    @using System.Data; 
    
    @inherits Nancy.ViewEngines.Razor.NancyRazorViewBase<System.Data.DataTable>
    
    <h2>Report</h2> 
    
    <table> 
        <thead> 
        <tr> 
        @foreach (DataColumn col in Model.Columns)     
        {          
            <th>@col.ColumnName</th> 
        }     
        </tr> 
        </thead>         
        <tbody> 
        @foreach (DataRow row in Model.Rows)     
        {         
            <tr> 
            @foreach (DataColumn col in Model.Columns)         
            {              
                <td>@row[col.ColumnName]</td> 
            }         
            </tr> 
        }     
        </tbody> 
    </table>
    

    Ps:我更新了repository,添加了一个新模块“/data”,它完全符合您的要求。

    【讨论】:

    • 谢谢 Rafael,您的示例按预期工作,我将您的 app.config 复制到我的应用程序上,它可以工作。这里的问题是,如果我尝试在 Razor 中将 DataTable 绑定为模型,我会收到关于 System.ComponentModel.MarshalByValueComponent 类型程序集的异常,并且我不知道如何指示 Nancy 包含程序集/命名空间我需要在cshtml页面中。这是我真正的问题,如果你改变你的例子,你会明白我的意思
    • 嗨塞巴斯蒂亚诺,今晚我会尝试在家里复制错误,但在那之前你真的需要一个数据表吗?为什么不将对象列表与您的数据绑定?
    • 是的,你当然是对的,只是我想更好地理解页面中关于程序集引用的事情。我对这个问题进行了一些研究,我在页面中放入了一个 DataTable 的 foreach (foreach(Model.Rows 中的 DataRow dr)),我得到了错误。如果我更改迭代器定义,而不是“var dr”中的“DataRow dr”,我不再得到异常,所以我认为这是关于 Razor 页面没有的一些参考,但我不明白如何添加它,可能是对 System.ComponentModel 的引用。感谢您的宝贵时间!
    • Sebastiano 我能够复制问题并更新了答案。
    • 谢谢 Rafael,实际上是 app.config 配置的问题,现在它可以正常工作了!再次感谢!!!
    猜你喜欢
    • 2018-05-14
    • 2021-10-17
    • 1970-01-01
    • 2019-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多