Dove si trova questo System.MissingMethodException avvenendo? Come posso dire?
-
19-09-2019 - |
Domanda
Sono un novizio ad ASP.NET MVC (v2), e sto cercando di utilizzare una vista fortemente tipizzato legato ad un oggetto del modello che contiene due opzionali multi-selezionare oggetti ListBox. Facendo clic sul pulsante di invio, questi oggetti possono avere 0 o più valori selezionati per loro.
La mia classe del modello si presenta così:
using System;
using System.Web.Mvc;
using System.Collections.Generic;
namespace ModelClasses.Messages
{
public class ComposeMessage
{
public bool is_html { get; set; }
public bool is_urgent { get; set; }
public string message_subject { get; set; }
public string message_text { get; set; }
public string action { get; set; }
public MultiSelectList recipients { get; set; }
public MultiSelectList recipient_roles { get; set; }
public ComposeMessage()
{
this.is_html = false;
this.is_urgent = false;
this.recipients = new MultiSelectList(new Dictionary<int, string>(), "Key", "Value");
this.recipient_roles = new MultiSelectList(new Dictionary<int, string>(), "Key", "Value");
}
}
}
La mia opinione è simile al seguente:
<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<ModelClasses.Messages.ComposeMessage>" %>
<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">Compose A Message
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
<h2>
Compose A New Message:</h2>
<br />
<span id="navigation_top">
<%= Html.ActionLink("\\Home", "Index", "Home") %><%= Html.ActionLink("\\Messages", "Home") %></span>
<% using (Html.BeginForm())
{ %>
<fieldset>
<legend>Message Headers</legend>
<label for="message_subject">
Subject:</label>
<%= Html.TextBox("message_subject")%>
<%= Html.ValidationMessage("message_subject")%>
<label for="selected_recipients">
Recipient Users:</label>
<%= Html.ListBox("recipients") %>
<%= Html.ValidationMessage("selected_recipients")%>
<label for="selected_recipient_roles">
Recipient Roles:</label>
<%= Html.ListBox("recipient_roles") %>
<%= Html.ValidationMessage("selected_recipient_roles")%>
<label for="is_urgent">
Urgent?</label>
<%= Html.CheckBox("is_urgent") %>
<%= Html.ValidationMessage("is_urgent")%>
</fieldset>
<fieldset>
<legend>Message Text</legend>
<%= Html.TextArea("message_text") %>
<%= Html.ValidationMessage("message_text")%>
</fieldset>
<input type="reset" name="reset" id="reset" value="Reset" />
<input type="submit" name="action" id="send_message" value="Send" />
<% } %>
<span id="navigation_bottom">
<%= Html.ActionLink("\\Home", "Index", "Home") %><%= Html.ActionLink("\\Messages", "Home") %></span>
</asp:Content>
<asp:Content ID="Content3" ContentPlaceHolderID="Scripts" runat="server">
</asp:Content>
Ho un ActionResult senza parametri nel mio MessagesController in questo modo:
[Authorize]
public ActionResult ComposeMessage()
{
ModelClasses.Messages.ComposeMessage FormData = new ModelClasses.Messages.ComposeMessage();
Common C = (Common)Session["Common"];
FormData.recipients = new MultiSelectList(C.AvailableUsers, "Key", "Value");
FormData.recipient_roles = new MultiSelectList(C.AvailableRoles, "Key", "Value");
return View(FormData);
}
... e il mio controller model-based simile a questo:
[Authorize, AcceptVerbs(HttpVerbs.Post)]
public ActionResult ComposeMessage(ModelClasses.Messages.ComposeMessage FormData)
{
MyUserClass CurrentUser = (MyUserClass )Session["CurrentUser"];
Common C = (Common)Session["Common"];
//... (business logic)
return View(FormData);
}
Il problema è, posso accedere alla pagina prima di un bel presentare. Quando ho effettivamente fare selezioni e si preme il pulsante di invio, tuttavia, ottengo:
Server Error in '/' Application.
No parameterless constructor defined for this object.
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.
Exception Details: System.MissingMethodException: No parameterless constructor defined for this object.
Source Error:
An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.
Stack Trace:
[MissingMethodException: No parameterless constructor defined for this object.]
System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolean noCheck, Boolean& canBeCached, RuntimeMethodHandle& ctor, Boolean& bNeedSecurityCheck) +0
System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean fillCache) +86
System.RuntimeType.CreateInstanceImpl(Boolean publicOnly, Boolean skipVisibilityChecks, Boolean fillCache) +230
System.Activator.CreateInstance(Type type, Boolean nonPublic) +67
System.Activator.CreateInstance(Type type) +6
System.Web.Mvc.DefaultModelBinder.CreateModel(ControllerContext controllerContext, ModelBindingContext bindingContext, Type modelType) +307
System.Web.Mvc.DefaultModelBinder.BindSimpleModel(ControllerContext controllerContext, ModelBindingContext bindingContext, ValueProviderResult valueProviderResult) +495
System.Web.Mvc.DefaultModelBinder.BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) +473
System.Web.Mvc.DefaultModelBinder.GetPropertyValue(ControllerContext controllerContext, ModelBindingContext bindingContext, PropertyDescriptor propertyDescriptor, IModelBinder propertyBinder) +45
System.Web.Mvc.DefaultModelBinder.BindProperty(ControllerContext controllerContext, ModelBindingContext bindingContext, PropertyDescriptor propertyDescriptor) +642
System.Web.Mvc.DefaultModelBinder.BindProperties(ControllerContext controllerContext, ModelBindingContext bindingContext) +144
System.Web.Mvc.DefaultModelBinder.BindComplexElementalModel(ControllerContext controllerContext, ModelBindingContext bindingContext, Object model) +95
System.Web.Mvc.DefaultModelBinder.BindComplexModel(ControllerContext controllerContext, ModelBindingContext bindingContext) +2386
System.Web.Mvc.DefaultModelBinder.BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) +539
System.Web.Mvc.ControllerActionInvoker.GetParameterValue(ControllerContext controllerContext, ParameterDescriptor parameterDescriptor) +447
System.Web.Mvc.ControllerActionInvoker.GetParameterValues(ControllerContext controllerContext, ActionDescriptor actionDescriptor) +173
System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext, String actionName) +801
System.Web.Mvc.Controller.ExecuteCore() +151
System.Web.Mvc.ControllerBase.Execute(RequestContext requestContext) +105
System.Web.Mvc.ControllerBase.System.Web.Mvc.IController.Execute(RequestContext requestContext) +36
System.Web.Mvc.<>c__DisplayClass8.b__4() +65
System.Web.Mvc.Async.<>c__DisplayClass1.b__0() +44
System.Web.Mvc.Async.<>c__DisplayClass8
1.<BeginSynchronous>b__7(IAsyncResult _) +42
System.Web.Mvc.Async.WrappedAsyncResult
1.End() +140
System.Web.Mvc.Async.AsyncResultWrapper.End(IAsyncResult asyncResult, Object tag) +54
System.Web.Mvc.Async.AsyncResultWrapper.End(IAsyncResult asyncResult, Object tag) +40
System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult) +52
System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(IAsyncResult result) +36
System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +8677678
System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +155
Version Information: Microsoft .NET Framework Version:2.0.50727.3603; ASP.NET Version:2.0.50727.3082
Questo errore si presenta prima che io possa intrappolarlo. Non ho idea di dove sta soffocando, o quello che sta soffocando su. Non vedo nessun punto di questo modello che non può essere creato con un costruttore senza parametri, e non riesco a capire dove sta morendo ... aiuto è apprezzato, grazie.
-Jeremy
Soluzione
Fortemente digitando destinatari e recipient_roles come MultiSelectList potrebbe essere la causa di questo problema. Provate il seguente piccola modifica al proprio codice:
public object recipients { get; set; }
public object recipient_roles { get; set;