2012-04-18 79 views
1

我有问题通过AJAX向我的控制器提交表单。其他人有类似的错误消息似乎有关于使用接口作为他们的控制器方法存根(stub)类型的问题,我没有这个问题。我已经包含了我的部分视图和控制器代码,如果我错过了任何信息,请让我知道。我怀疑它在更改下拉列表中的值后与创建模型有关,但错误消息不是最有帮助的,所以我有点卡住了!MVC2 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.RuntimeTypeHandle.CreateInstance(RuntimeType类型,布尔publicOnly,布尔NOCHECK,布尔& canBeCached,RuntimeMethodHandle &构造函数,布尔& bNeedSecurityCheck)在System.RuntimeType.CreateInstanceSlow(布尔publicOnly,布尔fillCache)在System.RuntimeType .CreateInstanceImpl(布尔publicOnly,布尔skipVisibilityChecks,布尔fillCache)在System.Web.Mvc.DefaultModelBinder.CreateModel System.Activator.CreateInstance(类型类型,布尔nonPublic)System.Web上的(ControllerContext controllerContext,ModelBindingContext bindingContext,类型modelType)。 Mvc.DefaultModelBinder.BindComplexModel(ControllerContext controllerContext,ModelBindingContext bindingContext)at System.Web.Mvc.DefaultModelBinder.GetPropertyValue(在System.Web.Mvc.DefaultModelBinder.BindProperties(ControllerContext controllerContext,ModelBindingContext bindingContext)上System.Web.Mvc.DefaultModelBinder.BindProperty(ControllerContext controllerContext,ModelBindingContext bindingContext,PropertyDescriptor propertyDescriptor)上的ControllerContext控制器上下文,ModelBindingContext bindingContext,PropertyDescriptor propertyDescriptor,IModelBinder propertyBinder) System.Web.Mvc.DefaultModelBinder.BindComplexElementalModel(ControllerContext controllerContext,ModelBindingContext bindingContext,Object model)at System.Web.Mvc.DefaultModelBinder.BindComplexModel(ControllerContext controllerContext,ModelBindingContext bindingContext)at System.Web.Mvc.ControllerActionInvoker.GetParameterValue(ControllerContext controllerContext, ParameterDescriptor parameterDescriptor)在System.Web.Mvc.ControllerActionInvoker.GetParameterValues(ControllerContext controllerContext,ActionDescriptor actionDescriptor)上System.Web.Mvc.Contro llerActionInvoker.InvokeAction(ControllerContext controllerContext,String actionName)

回答

1

您尚未显示您的RequestDetailModel对象,但如果存在属性为接口类型的默认模型联编程序无法填充它们。例如,如果你具备以下条件:

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

其中IRequest是一个接口或抽象类,这将无法正常工作。如果你想在你的模型中使用接口,你需要编写一个自定义模型绑定器。这种自定义模型绑定器的one example与抽象类一起工作,但接口将是相同的。

+0

你是对的,而不是使用接口,我完全充实了我的模型,以获得我需要的所有属性。谢谢! – Mark 2012-04-26 16:06:14