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