.NET Core项目引用含System.Web.Mvc的.NET Framework类库问题
可行解决方案
方法1:抽象依赖,重构ViewModel类库
- 定义一个不依赖任何MVC框架的
CustomSelectListItem类,包含Value、Text、Selected三个核心属性,可放在现有业务模型类库或新建通用类库中。 - 修改原ViewModel类库,将所有
System.Web.Mvc.SelectListItem替换为自定义的CustomSelectListItem,移除对System.Web.Mvc的引用。 - 在ASP.NET MVC 4.8主项目中,编写扩展方法实现
CustomSelectListItem与System.Web.Mvc.SelectListItem的双向转换;在ASP.NET Core 3.1客户门户项目中,编写对应扩展方法实现CustomSelectListItem与Microsoft.AspNetCore.Mvc.Rendering.SelectListItem的双向转换。 - 改造完成后,ViewModel类库可同时被两个项目正常引用,无需复制代码。
方法2:多目标框架兼容改造
- 将ViewModel类库改为多目标框架项目,支持同时编译.NET Framework 4.8和.NET Core 3.1。
- 编辑类库的
.csproj文件,修改目标框架配置:
<TargetFrameworks>net48;netcoreapp3.1</TargetFrameworks>
- 在ViewModel代码中,用条件编译指令区分不同框架下的SelectListItem引用:
#if NET48 using SelectListItem = System.Web.Mvc.SelectListItem; #else using SelectListItem = Microsoft.AspNetCore.Mvc.Rendering.SelectListItem; #endif public class OrderViewModel { public List<SelectListItem> PaymentMethods { get; set; } }
- 编译后类库会生成对应两个框架的版本,MVC 4.8和Core项目都能直接引用,不会出现类型冲突。
方法3:适配器模式转换类型
- 保留原ViewModel类库不变,在ASP.NET Core 3.1项目中创建静态适配器类,专门处理两种SelectListItem的转换:
public static class SelectListItemConverter { public static Microsoft.AspNetCore.Mvc.Rendering.SelectListItem ToCoreItem(this System.Web.Mvc.SelectListItem legacyItem) { if (legacyItem == null) return null; return new Microsoft.AspNetCore.Mvc.Rendering.SelectListItem { Value = legacyItem.Value, Text = legacyItem.Text, Selected = legacyItem.Selected }; } public static List<Microsoft.AspNetCore.Mvc.Rendering.SelectListItem> ToCoreList(this IEnumerable<System.Web.Mvc.SelectListItem> legacyItems) { return legacyItems?.Select(ToCoreItem).ToList() ?? new List<Microsoft.AspNetCore.Mvc.Rendering.SelectListItem>(); } }
- 在Core项目中使用ViewModel时,调用转换方法将属性转为Core兼容类型再使用:
var legacyViewModel = _service.GetViewModel(); var coreSelectList = legacyViewModel.Options.ToCoreList();
内容的提问来源于stack exchange,提问作者Warda
相关产品推荐
相关产品推荐

