You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 20:15:39