[英]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.