簡體   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