ASP.NET MVC 助手,MVC 版本独立

本文关键字:MVC 版本 独立 助手 NET ASP | 更新日期: 2023-09-27 18:34:25

我想在一个单独的(C#(项目中创建一些'基于扩展的HTML帮助程序'。例如,这些 html 帮助程序在 www.asp.net 中进行了描述。

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

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

我知道<bindingRedirect />配置,但如果客户端(使用 MVC 帮助程序的项目(不被迫使用此<bindingRedirect />元素,我会很好。

ASP.NET MVC 助手,MVC 版本独立

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

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

将 nuget 包放在任一 nuget.org 中(也可以使用专用的 nuget 源(,并确保包依赖于 MVC,并将正确的版本作为主要版本和次要版本。您可能需要其中一些来匹配 MVC 版本。

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

如何创建 nuget 包

我不确定是否有更好的方法来执行"条件依赖项",但我这样做的方法是手动编辑 .csproj 文件。例如,下面是 MvcSiteMapProvider 项目的示例:

<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>
当然,在整个代码

中使用了 MVC2、MVC3、MVC4 和 MVC5 的常量,以及为每个版本重用相同的代码库。生成项目时,生成脚本会将 MVC 版本作为参数传递,并为每个 MVC 版本创建一个单独的 DLL。

直接链接到 csproj 文件

注意:虽然这工作正常,但Visual Studio在引用列表中显示未选择的引用,并带有黄色图标,这可能有些令人不安。我还没有找到一种方法来使这项工作在Visual Studio中很好地显示,或者实际上可以使用Visual Studio的工具进行编辑。

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