C# ASP.NET MVC帮助程序,独立于MVC版本

C# ASP.NET MVC帮助程序,独立于MVC版本,c#,asp.net-mvc,C#,Asp.net Mvc,我想在一个单独的(C#)项目中创建一些“基于扩展的HTML助手”。例如,在中描述了这些html帮助程序 由于这些方法是HtmlHelper类的扩展,并且HtmlHelper类位于中,因此项目需要引用此程序集。但是项目依赖于特定的MVC版本(3、4、5等) 我想编写独立于MVC版本(但基于扩展)的MVC助手。这可能吗 我知道配置,但如果客户机(使用MVC帮助程序的项目)不被迫使用此元素,我会很高兴 我不确定是否有更好的方法来实现“条件依赖”,但我的方法是手工编辑.csproj文件。例如,以下是该项

我想在一个单独的(C#)项目中创建一些“基于扩展的HTML助手”。例如,在中描述了这些html帮助程序

由于这些方法是
HtmlHelper
类的扩展,并且
HtmlHelper
类位于中,因此项目需要引用此程序集。但是项目依赖于特定的MVC版本(3、4、5等)

我想编写独立于MVC版本(但基于扩展)的MVC助手。这可能吗


我知道配置,但如果客户机(使用MVC帮助程序的项目)不被迫使用此
元素,我会很高兴

我不确定是否有更好的方法来实现“条件依赖”,但我的方法是手工编辑.csproj文件。例如,以下是该项目的一个示例:


真的
..\packages\Microsoft.AspNet.Mvc.3.0.20105.1\lib\net40\System.Web.Mvc.dll
真的
..\packages\Microsoft.AspNet.Razor.1.0.20105.408\lib\net40\System.Web.Razor.dll
真的
..\packages\Microsoft.AspNet.WebPages.1.0.20105.408\lib\net40\System.Web.WebPages.Razor.dll
真的
..\packages\Microsoft.AspNet.Mvc.4.0.20710.0\lib\net40\System.Web.Mvc.dll
真的
..\packages\Microsoft.AspNet.Razor.4.0.20715.0\lib\net40\System.Web.Razor.dll
真的
..\packages\Microsoft.AspNet.WebPages.4.0.20710.0\lib\net40\System.Web.WebPages.Razor.dll
真的
..\packages\Microsoft.AspNet.Mvc.5.0.0\lib\net45\System.Web.Mvc.dll
真的
..\packages\Microsoft.AspNet.Razor.3.0.0\lib\net45\System.Web.Razor.dll
真的
..\packages\Microsoft.AspNet.WebPages.3.0.0\lib\net45\System.Web.WebPages.dll
真的
..\packages\Microsoft.AspNet.WebPages.3.0.0\lib\net45\System.Web.WebPages.Razor.dll
当然,MVC2、MVC3、MVC4和MVC5的常量在整个代码中都有使用,也可以在每个版本中重用相同的代码库。构建项目时,构建脚本将MVC版本作为参数传递,并为每个MVC版本创建单独的DLL

注意:尽管这样做很好,但VisualStudio会在引用列表中用一个黄色图标显示未选择的引用,这可能会有点令人不安。我还没有找到一种方法使它能够在VisualStudio中很好地显示,或者可以用VisualStudio的工具进行编辑


完全披露:我是MvcSiteMapProvider的主要贡献者。

您不必担心客户端必须添加绑定重定向。这曾经是几年前Nube解决的问题

因此,与其共享dll,不如共享nuget包。您可能需要多个版本,因为绑定重定向无法从MVC 3工作到MVC 5(因为MVC 5中删除了中等信任更改)。因此,您最终将得到两个nuget软件包(在nuget.org上搜索AutoFac MVC,查看它们做了什么),或者只支持MVC 5及以上版本,它已经推出一年多了

将nuget包放在nuget.org中(或者您可以使用私有的nuget提要),并确保您的包依赖于MVC,并具有正确的主版本和次版本。您可能需要其中一些来匹配MVC版本

nuget的好处在于,对于与代码兼容的版本(比如MVC5、5.1、5.2、5.2.2等),您只需要一个dll,nuget将自动添加绑定重定向,而最终用户无需键入它们

要创建nuget包,请查看和项目。它们使用符号/项目来分隔引用,但共享一个代码库(使用单个文件)。
<ItemGroup Condition=" $(DefineConstants.Contains('MVC2')) ">
    <Reference Include="System.Web.Mvc, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL" />
</ItemGroup>
<ItemGroup Condition=" $(DefineConstants.Contains('MVC3')) ">
    <!-- Due to the windows update MS14-059, we need this hack to ensure we can build MVC3 both on machines that have the update and those that don't -->
    <Reference Condition=" Exists('$(windir)\Microsoft.NET\assembly\GAC_MSIL\System.Web.Mvc\v4.0_3.0.0.0__31bf3856ad364e35\System.Web.Mvc.dll') " Include="System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL" />
    <Reference Condition=" !Exists('$(windir)\Microsoft.NET\assembly\GAC_MSIL\System.Web.Mvc\v4.0_3.0.0.0__31bf3856ad364e35\System.Web.Mvc.dll') " Include="System.Web.Mvc, Version=3.0.0.1, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
        <Private>True</Private>
        <HintPath>..\packages\Microsoft.AspNet.Mvc.3.0.20105.1\lib\net40\System.Web.Mvc.dll</HintPath>
    </Reference>
    <Reference Include="System.Web.Razor, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
        <Private>True</Private>
        <HintPath>..\packages\Microsoft.AspNet.Razor.1.0.20105.408\lib\net40\System.Web.Razor.dll</HintPath>
    </Reference>
    <Reference Include="System.Web.WebPages.Razor, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
        <Private>True</Private>
        <HintPath>..\packages\Microsoft.AspNet.WebPages.1.0.20105.408\lib\net40\System.Web.WebPages.Razor.dll</HintPath>
    </Reference>
</ItemGroup>
<ItemGroup Condition=" $(DefineConstants.Contains('MVC4')) ">
    <Reference Include="System.Web.Mvc, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
        <Private>True</Private>
        <HintPath>..\packages\Microsoft.AspNet.Mvc.4.0.20710.0\lib\net40\System.Web.Mvc.dll</HintPath>
    </Reference>
    <Reference Include="System.Web.Razor, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
        <Private>True</Private>
        <HintPath>..\packages\Microsoft.AspNet.Razor.4.0.20715.0\lib\net40\System.Web.Razor.dll</HintPath>
    </Reference>
    <Reference Include="System.Web.WebPages.Razor, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
        <Private>True</Private>
        <HintPath>..\packages\Microsoft.AspNet.WebPages.4.0.20710.0\lib\net40\System.Web.WebPages.Razor.dll</HintPath>
    </Reference>
</ItemGroup>
<ItemGroup Condition=" $(DefineConstants.Contains('MVC5')) ">
    <Reference Include="System.Web.Mvc, Version=5.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
        <Private>True</Private>
        <HintPath>..\packages\Microsoft.AspNet.Mvc.5.0.0\lib\net45\System.Web.Mvc.dll</HintPath>
    </Reference>
    <Reference Include="System.Web.Razor, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
        <Private>True</Private>
        <HintPath>..\packages\Microsoft.AspNet.Razor.3.0.0\lib\net45\System.Web.Razor.dll</HintPath>
    </Reference>
    <Reference Include="System.Web.WebPages, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
        <Private>True</Private>
        <HintPath>..\packages\Microsoft.AspNet.WebPages.3.0.0\lib\net45\System.Web.WebPages.dll</HintPath>
    </Reference>
    <Reference Include="System.Web.WebPages.Razor, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
        <Private>True</Private>
        <HintPath>..\packages\Microsoft.AspNet.WebPages.3.0.0\lib\net45\System.Web.WebPages.Razor.dll</HintPath>
    </Reference>
</ItemGroup>