我在ASP.NETMVC5应用程序中使用AutoMapper 6.2.0.

当我通过控制器调用我的视图时,它会正确显示所有内容.但是,当我刷新该视图时,Visual Studio显示一个错误:

System.InvalidOperationException:‘映射器已初始化.每个应用程序域/进程必须调用Initialize一次.’

我只在一个控制器中使用AutoMapper.尚未在任何地方进行任何配置,也未在任何其他服务或控制器中使用AutoMapper.

我的控制器:

public class StudentsController : Controller
{
    private DataContext db = new DataContext();

    // GET: Students
    public ActionResult Index([Form] QueryOptions queryOptions)
    {
        var students = db.Students.Include(s => s.Father);

        AutoMapper.Mapper.Initialize(cfg =>
        {
            cfg.CreateMap<Student, StudentViewModel>();
        });
            return View(new ResulList<StudentViewModel> {
            QueryOptions = queryOptions,
            Model = AutoMapper.Mapper.Map<List<Student>,List<StudentViewModel>>(students.ToList())
        });
    }

    // Other Methods are deleted for ease...

控制器内的错误:

enter image description here

我的模型类:

public class Student
{
    [Key]
    public int Id { get; set; }
    public string Name { get; set; }
    public string CNIC { get; set; }
    public string FormNo { get; set; }
    public string PreviousEducaton { get; set; }
    public string DOB { get; set; }
    public int AdmissionYear { get; set; }

    public virtual Father Father { get; set; }
    public virtual Sarparast Sarparast { get; set; }
    public virtual Zamin Zamin { get; set; }
    public virtual ICollection<MulaqatiMehram> MulaqatiMehram { get; set; }
    public virtual ICollection<Result> Results { get; set; }
}

我的ViewModel类:

public class StudentViewModel
{
    [Key]
    public int Id { get; set; }

    public string Name { get; set; }
    public string CNIC { get; set; }
    public string FormNo { get; set; }
    public string PreviousEducaton { get; set; }
    public string DOB { get; set; }
    public int AdmissionYear { get; set; }

    public virtual FatherViewModel Father { get; set; }
    public virtual SarparastViewModel Sarparast { get; set; }
    public virtual ZaminViewModel Zamin { get; set; }
}

推荐答案

刷新视图时,您正在创建StudentsController的一个新实例,并因此重新初始化映射器,导致错误消息"映射器已初始化".

Getting Started Guide

Where do I configure AutoMapper?

如果您使用的是静态映射器方法,那么每个AppDomain只能进行一次配置.这意味着放置配置代码的最佳位置是在应用程序启动中,比如全局.ASP的asax文件.NET应用程序.

设置此功能的一种方法是将所有映射配置放入静电方法中.

App_Start/AutoMapperConfig.cs:

public class AutoMapperConfig
{
    public static void Initialize()
    {
        Mapper.Initialize(cfg =>
        {
            cfg.CreateMap<Student, StudentViewModel>();
            ...
        });
    }
}

然后在Global.asax.cs中调用这个方法

protected void Application_Start()
{
    App_Start.AutoMapperConfig.Initialize();
}

现在,您可以(重新)在控制器操作中使用它.

public class StudentsController : Controller
{
    public ActionResult Index(int id)
    {
        var query = db.Students.Where(...);

        var students = AutoMapper.Mapper.Map<List<StudentViewModel>>(query.ToList());

        return View(students);
    }
}

Asp.net相关问答推荐

Reaction-Native SignalR连接在调试模式下工作,在释放模式下失败

C# - 将 xyz 平铺转换为纬度/经度,反之亦然,给出不同的结果

为什么 Web 架构应该是松耦合的?

Azure Service Fabric 是否与 Docker 做同样的事情?

静态字段与会话变量

Response.Redirect 使用 ~ 路径

ASP.NET 在更新面板更新时显示正在加载...消息

FluentValidation 使用数据库的唯一名称验证

UseSqlServer 方法缺少 MVC 6

Ef core:执行 MaxAsync 时序列不包含任何元素

如何解决 Kerberos 双跳问题?

如何从 HTTP 请求中获取 MAC 地址?

MVC5 身份验证中的......与主域之间的信任关系失败

如何避免 ASP.NET MVC 中的 HttpRequestValidationException 呈现导致异常的相同视图

WebForm_PostBackOptions 文档

要调用此方法,Membership.Provider属性必须是ExtendedMembershipProvider的实例

如何防止aspxerrorpath作为查询字符串传递给 ASP.NET 自定义错误页面

捕获的异常本身为 null !

如何使用 encodeURIComponent() 解码在 JS 中编码的 HTML?

服务器标签格式不正确错误