1

我在通过 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 类型,Boolean publicOnly,Boolean noCheck,Boolean& canBeCached,RuntimeMethodHandle& ctor,Boolean& bNeedSecurityCheck)在 System.RuntimeType.CreateInstanceSlow(Boolean publicOnly,Boolean fillCache)在 System.RuntimeType.CreateInstanceImpl(Boolean publicOnly,Boolean skipVisibilityChecks , Boolean fillCache) 在 System.Activator.CreateInstance(Type type, Boolean nonPublic) 在 System.Web.Mvc.DefaultModelBinder.CreateModel(ControllerContext controllerContext, ModelBindingContext bindingContext, Type modelType) 在 System.Web.Mvc.DefaultModelBinder.BindComplexModel(ControllerContext controllerContext , ModelBindingContext bindingContext) 在 System.Web.Mvc.DefaultModelBinder.GetPropertyValue(ControllerContext controllerContext, ModelBindingContext bindingContext,PropertyDescriptor propertyDescriptor, IModelBinder propertyBinder) 在 System.Web.Mvc.DefaultModelBinder.BindProperty(ControllerContext controllerContext, ModelBindingContext bindingContext, PropertyDescriptor propertyDescriptor) 在 System.Web.Mvc.DefaultModelBinder.BindProperties(ControllerContext controllerContext, ModelBindingContext bindingContext) 在 System.Web.Mvc。在 System.Web.Mvc.ControllerActionInvoker.GetParameterValue(ControllerContext controllerContext, ParameterDescriptor parameterDescriptor) 在 System.Web.Mvc.DefaultModelBinder.BindComplexModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 在 System.Web.Mvc.DefaultModelBinder.BindComplexElementalModel(ControllerContext controllerContext, ModelBindingContext bindingContext, Object model)。 Web.Mvc.ControllerActionInvoker。在 System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext, String actionName) 上的 GetParameterValues(ControllerContext controllerContext, ActionDescriptor actionDescriptor)

4

1 回答 1

2

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

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

接口或抽象类在哪里IRequest不起作用。如果要在模型中使用接口,则需要编写自定义模型绑定器。这是这种自定义模型绑定器的一个示例,它与抽象类一起使用,但接口是相同的。

于 2012-04-20T06:14:48.960 回答