繁体   English   中英

ASP.NET MVC控制器有选择地抛出MissingMethodException [无法创建接口的实例]

[英]MissingMethodException [Cannot create an instance of an interface] thrown selectively by ASP.NET MVC controller

我在MVC 4应用程序中变得越来越奇怪(至少对我来说)。

我整个晚上都在搜寻Google; 我也读了很多SO帖子-不高兴; 我知道我无法直接实例化接口。

在此特定应用程序中,我将Ninject用于DI。 在控制器构造函数中,实例化了一个接口 ,那时一切都变淡了-实际上,我相信Ninject或其使用完全没有问题。

另外,我确定这段代码可以运行一次,并且此后没有进行任何更改,只是将Ninject库更新为3.2.2.0-不记得之前有哪个版本了。 显然是比较老的...

我在使用另一个我的WEB服务的同一个控制器中有简单的CRUD动作。 4种方法中有2种可以正常使用(LOL) Index()Create() 然而, Update()Delete()抛出上述异常; 这是堆栈跟踪:

[MissingMethodException: Cannot create an instance of an interface.]
    System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolean noCheck, Boolean& canBeCached, RuntimeMethodHandleInternal& ctor, Boolean& bNeedSecurityCheck) +0
    System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache, StackCrawlMark& stackMark) +119
    System.RuntimeType.CreateInstanceDefaultCtor(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache, StackCrawlMark& stackMark) +232
    System.Activator.CreateInstance(Type type, Boolean nonPublic) +83
    System.Activator.CreateInstance(Type type) +11
    System.Web.Mvc.DefaultModelBinder.CreateModel(ControllerContext controllerContext, ModelBindingContext bindingContext, Type modelType) +183
    System.Web.Mvc.DefaultModelBinder.BindComplexModel(ControllerContext controllerContext, ModelBindingContext bindingContext) +563
    System.Web.Mvc.DefaultModelBinder.BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) +416
    .
    .
    .

这是控制器,非常简单,真的...

public class NonFederalWorkingDayController : BaseController
{
    private readonly INonFederalWorkingDayManagementService _nonFederalWorkingDayService = null;

    public NonFederalWorkingDayController(INonFederalWorkingDayManagementService nonFederalWorkingDayService)
    {
        _nonFederalWorkingDayService = nonFederalWorkingDayService;
    }

    private JsonResultModel<IEnumerable<NonFederalWorkingDayDto>> InvokeService(Func<IEnumerable<NonFederalWorkingDayDto>, I9UserDto, IEnumerable<NonFederalWorkingDayDto>> operation, IEnumerable<NonFederalWorkingDayDto> models)
    {
        var result = new JsonResultModel<IEnumerable<NonFederalWorkingDayDto>>();

        if (ModelState.IsValid)
        {
            var modifier = new I9UserDto
            {
                Id = SiteContext.User.UserId
            };

            try
            {
                result.Model = operation(models, modifier);
                result.Message = "Operation completed successfully.";
            }
            catch (Exception ex)
            {
                result.HasError = true;
#if DEBUG
                result.Message = string.Concat("Operation failed: ", ex.Message);
#else
                result.Message = "Operation failed: Internal server error.";
#endif
            }

            if (result.Model != null)
            {
                foreach (var dto in result.Model)
                {
                    dto.CreatedOn = null;
                    dto.Creator = null;
                    dto.ModifiedOn = null;
                    dto.Modifier = null;
                }
            }
        }
        else
        {
            result.HasError = true;
            result.Message = "Invalid data.";
        }

        return result;
    }

    public ActionResult Index()
    {
        var model = _nonFederalWorkingDayService.Load();

        return View(model);
    }

    [HttpPost]
    public ActionResult Create(IEnumerable<NonFederalWorkingDayDto> models)
    {
        var result = InvokeService(_nonFederalWorkingDayService.Create, models);

        return Json(result);
    }

    [HttpPost]
    public ActionResult Update(IEnumerable<NonFederalWorkingDayDto> models)
    {
        var result = InvokeService(_nonFederalWorkingDayService.Update, models);

        return Json(result);
    }

    [HttpPost]
    public ActionResult Delete(IEnumerable<NonFederalWorkingDayDto> models)
    {
        var result = InvokeService(_nonFederalWorkingDayService.Delete, models);

        if (!result.HasError)
        {
            var plurality = models.Count() == 1 ? "Entity" : "Entities";
            result.Message = string.Concat(plurality, " deleted successfully.");
        }

        return Json(result);
    }
}

如前所述,问题出在最后两个方法之内: Update()Delete() 实际上,执行永远不会输入其中的任何一个-模型绑定期间错误会引发。 但是请注意,除了IEnumerable<>之外,没有接口,该接口在同一应用程序中的其他方法Create()包括该控制器中的Create()方法)中的绑定也很好。 我不确定精确度如何,但是DefaultBinder似乎足够聪明,可以确定IEnumerable实际上是List 所以这不应该是吗?

另外,我需要提及的是,我是通过AJAX而不是普通请求来调用这些操作的。 这重要吗?

我似乎不知道出什么问题了...请帮助!

UPDATE

为了继承模型绑定管道,我继承了DefaultModelBinder 所以我迷上了BindModel()controllerContext.Controller实际上是NonFederalWorkingDayController全功能实例

更新2

这是NonFederalWorkingDayDto的代码清单:

public class NonFederalWorkingDayDto : DtoBase, INonFederalWorkingDay
{
    public static NonFederalWorkingDayDto Consume(INonFederalWorkingDay Donor)
    {
        NonFederalWorkingDayDto result = null;

        if (Donor != null)
        {
            result = DtoBase.Consume<NonFederalWorkingDayDto>(Donor);

            result.Description = Donor.Description;
            result.FallsOn = Donor.FallsOn;
            result.Id = Donor.Id;
            result.Name = Donor.Name;
        }

        return result;
    }

    public string Description { get; set; }

    public DateTime? FallsOn { get; set; }

    public string Name { get; set; }

    #region INonFederalWorkingDay support

    DateTime INonFederalWorkingDay.FallsOn
    {
        get { return FallsOn ?? default(DateTime); }
    }

    int IIdentifier<int>.Id
    {
        get { return Id ?? default(int); }
    }

    #endregion
}

我认为您的操作声明是问题所在,请尝试:

[HttpPost]
public ActionResult Create(List<NonFederalWorkingDayDto> models)
{
    ...
}

[HttpPost]
public ActionResult Update(List<NonFederalWorkingDayDto> models)
{
    ...
}

[HttpPost]
public ActionResult Delete(List<NonFederalWorkingDayDto> models)
{
    ...
}

真正的解释是在消息中,即它不能创建接口的实例,正如您所说的构造函数很酷,因此问题在于IEnumerable,它需要是一个具体的可枚举类(例如List)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM