MVC2 Ajax表单提交导致“无法创建接口实例”错误

时间:2012-04-18 15:02:30

标签: asp.net-mvc

我在通过AJAX向我的控制器提交表单时遇到问题。其他具有类似错误消息的人似乎在使用接口作为其控制器方法存根上的类型时遇到问题,我没有这个问题。我已经包含了我的部分视图和控制器代码,如果我错过了任何信息,请告诉我。在我更改下拉列表中的值之后,我怀疑它与模型的创建有关,但错误消息不是最有帮助的,所以我有点卡住了!

我的部分观点:

<% using (Ajax.BeginForm("RequestDetails", "Home", new { RequestId = Model.Request.RequestId, RequestStatus = Model.Request.Status }, new AjaxOptions
        {
            HttpMethod = "POST",
            InsertionMode = InsertionMode.Replace,
            UpdateTargetId = "Details"
        },
        new { @class = "jqtransform" }))
        {%>

        <%= Html.LabelFor(m => Model.Request.Name) %>
        <p><%= Html.Encode(Model.Request.Name)%>&nbsp;</p>
        <%= Html.LabelFor(m => Model.Request.Status) %>
        <% if (Html.IsAdmin(this.Page))
        {%>
            <div class="rowElem">
            <%=Html.DropDownListFor(m => Model.Request.Status, (IEnumerable<SelectListItem>)ViewData["requestStatus"], null, new { onchange = "this.form.submit();" })%>
            </div>
    <%  }
        else
        { %>
            <p><%= Html.Encode(Model.Request.Status.GetStringValue())%>&nbsp;</p>
        <% } }%>    

我的控制器:

[HttpPost]
    public PartialViewResult RequestDetails(RequestDetailModel model, Guid RequestId, string RequestStatus)
    {
        if (ModelState.IsValid)
        {
            RequestMethods requestMethods = new RequestMethods();

            IRequest request = _requestRepo.GetRequestById(CurrentUser, RequestId, CompanyId);

            requestMethods.UpdateRequestStatus(request, CurrentUser, model.NewComment, model.Request.Status);

        }

        model.Request = _requestRepo.GetRequestById(CurrentUser, RequestId, CompanyId);

        return PartialView(model);
    }

抛出的确切错误是:

无法创建接口的实例。

在System.RuntimeType.CreateInstanceImpl的System.RuntimeType.CreateInstanceSlow(Boolean publicOnly,Boolean fillCache)中的System.RuntimeTypeHandle.CreateInstance(RuntimeType类型,Boolean publicOnly,Boolean noCheck,Boolean&amp; canBeCached,RuntimeMethodHandle&amp; ctor,Boolean&amp; bNeedSecurityCheck)(布尔值publicOnly) ,System.Web.Mvc.DefaultModelBinder.BindComplexModel上System.Web.Mvc.DefaultModelBinder.CreateModel(ControllerContext controllerContext,ModelBindingContext bindingContext,Type modelType)的System.Activator.CreateInstance(Type type,Boolean nonPublic)中的布尔值skipVisibilityChecks,Boolean fillCache) (ControllerContext controllerContext,ModelBindingContext bindingContext)在System.Web.Mvc.DefaultModelBinder.BindProperty(ControllerContext controllerContext,ModelBindi)的System.Web.Mvc.DefaultModelBinder.GetPropertyValue(ControllerContext controllerContext,ModelBindingContext bindingContext,PropertyDescriptor propertyDescriptor,IModelBinder propertyBinder)中位于System.Web.Mvc的System.Web.Mvc.DefaultModelBinder.BindComplexElementalModel(ControllerContext controllerContext,ModelBindingContext bindingContext,Object model)的System.Web.Mvc.DefaultModelBinder.BindProperties(ControllerContext controllerContext,ModelBindingContext bindingContext)中的ngContext bindingContext,PropertyDescriptor propertyDescriptor。 System.Web.Mvc上System.Web.Mvc.ControllerActionInvoker.GetParameterValues(ControllerContext controllerContext,ActionDescriptor actionDescriptor)的System.Web.Mvc.ControllerActionInvoker.GetParameterValue(ControllerContext controllerContext,ParameterDescriptor parameterDescriptor)中的DefaultModelBinder.BindComplexModel(ControllerContext controllerContext,ModelBindingContext bindingContext) .ControllerActionInvoker.InvokeAction(ControllerContext controllerContext,String actionName)

1 个答案:

答案 0 :(得分:2)

您尚未显示RequestDetailModel对象,但如果存在属性为接口类型,则默认模型绑定器无法填充它们。例如,如果您有以下内容:

public class RequestDetailModel 
{
    public IRequest Request { get; set; }
}

其中IRequest是一个接口或抽象类,这是行不通的。如果要在模型中使用接口,则需要编写自定义模型绑定器。这是定制模型绑定器的one example,它与抽象类一起工作,但接口也是一样的。