2012-04-10 5 views
1

Ich versuche derzeit, die Registrierungskomponente des Standard-MVC-Projekts zu ändern, um ein bisschen mehr an mein Projekt anzupassen. Ich habe die RegisterModel, Register.aspx und AccountController dazu geändert. Ich kann die Registeransicht gut sehen, aber wenn ich es übergebe, erhalte ich den Fehler im Titel, und es gibt mir wenig, wo das Problem herkommt. Kann mich bitte jemand in die richtige Richtung lenken, damit ich das beheben kann?ASP.NET MVC2: "System.MissingMethodException: Kein parameterloser Konstruktor für dieses Objekt definiert."

UPDATE:ich die innere Ausnahme auch hinzugefügt haben

UPDATE 2:ich den Code zu einer besseren Form zu Mystere Man Vorschläge geändert haben. Ich habe ein ViewModel für das Formular erstellt, um das Modell von der Logik zu trennen. Ich erhalte immer noch denselben Fehler.

Hier ist Model, View und Controller-Code:

RegisterModel:

[PropertiesMustMatch("Password", "ConfirmPassword", ErrorMessage = "The password and confirmation password do not match.")] 
public class RegisterModel 
{ 

    [Required] 
    [DisplayName("First Name")] 
    public string FirstName { get; set; } 

    [Required] 
    [DisplayName("Last Name")] 
    public string LastName { get; set; } 

    [DisplayName("Phone")] 
    [DataType(DataType.PhoneNumber)] 
    public string Phone { get; set; } 

    [DisplayName("Fax")] 
    [DataType(DataType.PhoneNumber)] 
    public string Fax { get; set; } 

    [Required] 
    [DisplayName("User name")] 
    public string UserName { get; set; } 

    [Required] 
    [DataType(DataType.EmailAddress)] 
    [DisplayName("Email address")] 
    public string Email { get; set; } 

    [Required] 
    [ValidatePasswordLength] 
    [DataType(DataType.Password)] 
    [DisplayName("Password")] 
    public string Password { get; set; } 

    [Required] 
    [DataType(DataType.Password)] 
    [DisplayName("Confirm password")] 
    public string ConfirmPassword { get; set; } 

}  

Account:

public ActionResult Register() 
{ 
    ViewData["PasswordLength"] = MembershipService.MinPasswordLength; 
    return View(new UserFormModel()); 
} 

[HttpPost] 
public ActionResult Register(UserFormModel model) 
{ 

    ClaritySharetrackEntities db = new ClaritySharetrackEntities(); 

    if (ModelState.IsValid) 
    { 
     // Attempt to register the user 
     MembershipCreateStatus createStatus = MembershipService.CreateUser(model.RegisterModel.UserName, model.RegisterModel.Password, model.RegisterModel.Email); 

     if (createStatus == MembershipCreateStatus.Success) 
     { 
      MembershipUser user = Membership.GetUser(model.RegisterModel.UserName); 
      int userid = Convert.ToInt32(user.ProviderUserKey); 
      Profile profile = new Profile() 
      { 
       UserID = userid, 
       FirstName = model.RegisterModel.FirstName, 
       LastName = model.RegisterModel.LastName, 
       Phone = model.RegisterModel.Phone, 
       Fax = model.RegisterModel.Fax 
      }; 

      db.Profiles.AddObject(profile); 
      db.SaveChanges(); 

      //FormsService.SignIn(model.UserName, false /* createPersistentCookie */); 
      return RedirectToAction("Welcome", "Home"); 
     } 
     else 
     { 
      ModelState.AddModelError("", AccountValidation.ErrorCodeToString(createStatus)); 
     } 
    } 

    // If we got this far, something failed, redisplay form 
    ViewData["PasswordLength"] = MembershipService.MinPasswordLength; 
    return View(model); 
} 

Register.aspx:

<asp:Content ID="registerContent" ContentPlaceHolderID="MainContent" runat="server"> 
    <h2>Create a New Account</h2> 
    <p> 
     Use the form below to create a new account. 
    </p> 
    <p> 
     Passwords are required to be a minimum of <%: ViewData["PasswordLength"] %> characters in length. 
    </p> 

    <% using (Html.BeginForm()) { %> 
     <%: Html.ValidationSummary(true, "Account creation was unsuccessful. Please correct the errors and try again.") %> 
     <div> 
      <fieldset> 
       <legend>Account Information</legend> 

       <div class="editor-label"> 
        <%: Html.LabelFor(m =>m.RegisterModel.FirstName) %> 
       </div> 
       <div class="editor-field"> 
        <%: Html.TextBoxFor(m =>m.RegisterModel.FirstName)%> 
        <%: Html.ValidationMessageFor(m =>m.RegisterModel.FirstName)%> 
       </div> 

       <div class="editor-label"> 
        <%: Html.LabelFor(m =>m.RegisterModel.LastName) %> 
       </div> 
       <div class="editor-field"> 
        <%: Html.TextBoxFor(m =>m.RegisterModel.LastName)%> 
        <%: Html.ValidationMessageFor(m =>m.RegisterModel.LastName)%> 
       </div> 

       <div class="editor-label"> 
        <%: Html.LabelFor(m =>m.RegisterModel.Phone) %> 
       </div> 
       <div class="editor-field"> 
        <%: Html.TextBoxFor(m =>m.RegisterModel.Phone)%> 
        <%: Html.ValidationMessageFor(m =>m.RegisterModel.Phone)%> 
       </div> 

       <div class="editor-label"> 
        <%: Html.LabelFor(m =>m.RegisterModel.Fax) %> 
       </div> 
       <div class="editor-field"> 
        <%: Html.TextBoxFor(m =>m.RegisterModel.Fax)%> 
        <%: Html.ValidationMessageFor(m =>m.RegisterModel.Fax)%> 
       </div> 

       <div class="editor-label"> 
        <%: Html.LabelFor(m =>m.RegisterModel.UserName) %> 
       </div> 
       <div class="editor-field"> 
        <%: Html.TextBoxFor(m =>m.RegisterModel.UserName)%> 
        <%: Html.ValidationMessageFor(m =>m.RegisterModel.UserName)%> 
       </div> 

       <div class="editor-label"> 
        <%: Html.LabelFor(m =>m.RegisterModel.Email)%> 
       </div> 
       <div class="editor-field"> 
        <%: Html.TextBoxFor(m =>m.RegisterModel.Email)%> 
        <%: Html.ValidationMessageFor(m =>m.RegisterModel.Email)%> 
       </div> 

       <div class="editor-label"> 
        <%: Html.LabelFor(m =>m.RegisterModel.Password)%> 
       </div> 
       <div class="editor-field"> 
        <%: Html.PasswordFor(m =>m.RegisterModel.Password) %> 
        <%: Html.ValidationMessageFor(m =>m.RegisterModel.Password)%> 
       </div> 

       <div class="editor-label"> 
        <%: Html.LabelFor(m =>m.RegisterModel.ConfirmPassword)%> 
       </div> 
       <div class="editor-field"> 
        <%: Html.PasswordFor(m =>m.RegisterModel.ConfirmPassword)%> 
        <%: Html.ValidationMessageFor(m =>m.RegisterModel.ConfirmPassword)%> 
       </div> 

       <div class="editor-label"> 
        <%: Html.LabelFor(m => m.RoleList) %> 
       </div> 
       <div class="editor-field"> 
        <%: Html.DropDownListFor(m => m.RoleList, Model.RoleList) %> 
        <%: Html.ValidationMessageFor(m => m.RoleList)%> 
       </div> 

       <div class="editor-label"> 
        <%: Html.LabelFor(m => m.ActiveList) %> 
       </div> 
       <div class="editor-field"> 
        <%: Html.DropDownListFor(m => m.RoleList, Model.ActiveList)%> 
        <%: Html.ValidationMessageFor(m => m.ActiveList)%> 
       </div> 

       <div class="editor-label"> 
        <%: Html.LabelFor(m => m.CompanyList) %> 
       </div> 
       <div class="editor-field"> 
        <%: Html.DropDownListFor(m => m.RoleList, Model.CompanyList)%> 
        <%: Html.ValidationMessageFor(m => m.CompanyList)%> 
       </div> 

       <p> 
        <input type="submit" value="Register" /> 
       </p> 
      </fieldset> 
     </div> 
    <% } %> 
</asp:Content> 

UserFormModel:

public class UserFormModel 
{ 
    private ClaritySharetrackEntities entities = new ClaritySharetrackEntities(); 

    public RegisterModel RegisterModel { get; private set; } 
    public SelectList ActiveList { get; private set; } 
    public SelectList CompanyList { get; private set; } 
    public SelectList RoleList { get; private set; } 

    public UserFormModel() 
    { 
     SetActiveList(); 
     SetCompanyList(); 
     SetRoleList(); 
    } 

    private void SetActiveList() 
    { 
     var activeList = new List<SelectListItem>{ new SelectListItem{Text = "Yes", Value = "True"}, 
                new SelectListItem{Text = "No", Value = "False"}, 
                }; 

     ActiveList = new SelectList(activeList, "Value", "Text"); 
    } 

    private void SetCompanyList() 
    { 
     CompanyRepository companyRepository = new CompanyRepository(); 
     var companies = companyRepository.GetAllCompanies().Select(c => new { Text = c.CompanyName, Value = c.CompanyID }); 

     this.CompanyList = new SelectList(companies, "Value", "Text"); 
    } 

    private void SetRoleList() 
    { 
     string[] roles = Roles.GetAllRoles(); 

     List<SelectListItem> roleList = new List<SelectListItem>(); 

     foreach (string str in roles) 
     { 
      SelectListItem listItem = new SelectListItem() { Text = str, Value = str }; 

      roleList.Add(listItem); 
     } 

     RoleList = new SelectList(roleList, "Value", "Text"); 
    } 
} 

Innere Ausnahme:

[MissingMethodException: No parameterless constructor defined for this object.] 
    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) +98 
    System.RuntimeType.CreateInstanceDefaultCtor(Boolean publicOnly, Boolean skipVisibilityChecks, Boolean skipCheckThis, Boolean fillCache) +241 
    System.Activator.CreateInstance(Type type, Boolean nonPublic) +69 
    System.Activator.CreateInstance(Type type) +6 
    System.Web.Mvc.DefaultModelBinder.CreateModel(ControllerContext controllerContext, ModelBindingContext bindingContext, Type modelType) +403 
    System.Web.Mvc.DefaultModelBinder.BindSimpleModel(ControllerContext controllerContext, ModelBindingContext bindingContext, ValueProviderResult valueProviderResult) +544 
    System.Web.Mvc.DefaultModelBinder.BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) +479 
    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) +658 
    System.Web.Mvc.DefaultModelBinder.BindProperties(ControllerContext controllerContext, ModelBindingContext bindingContext) +147 
    System.Web.Mvc.DefaultModelBinder.BindComplexElementalModel(ControllerContext controllerContext, ModelBindingContext bindingContext, Object model) +98 
    System.Web.Mvc.DefaultModelBinder.BindComplexModel(ControllerContext controllerContext, ModelBindingContext bindingContext) +2504 
    System.Web.Mvc.DefaultModelBinder.BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) +548 
    System.Web.Mvc.ControllerActionInvoker.GetParameterValue(ControllerContext controllerContext, ParameterDescriptor parameterDescriptor) +473 
    System.Web.Mvc.ControllerActionInvoker.GetParameterValues(ControllerContext controllerContext, ActionDescriptor actionDescriptor) +181 
    System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext, String actionName) +830 
    System.Web.Mvc.Controller.ExecuteCore() +136 
    System.Web.Mvc.ControllerBase.Execute(RequestContext requestContext) +111 
    System.Web.Mvc.ControllerBase.System.Web.Mvc.IController.Execute(RequestContext requestContext) +39 
    System.Web.Mvc.<>c__DisplayClass8.<BeginProcessRequest>b__4() +65 
    System.Web.Mvc.Async.<>c__DisplayClass1.<MakeVoidDelegate>b__0() +44 
    System.Web.Mvc.Async.<>c__DisplayClass8`1.<BeginSynchronous>b__7(IAsyncResult _) +42 
    System.Web.Mvc.Async.WrappedAsyncResult`1.End() +141 
    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) +38 
    System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +690 
    System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +194 
+0

In Ihrer Ausnahme sollten Sie eine InnerException mit mehr Details haben – Patrick

+0

Ich habe die Informationen aktualisiert, um die innere Ausnahme anzuzeigen. Danke – PatG

Antwort

2

Ich weiß, dass Sie dies jetzt funktioniert - was großartig ist.

Ich wollte nur eine Notiz hier posten: Seien Sie vorsichtig, wenn Sie SelectList in Ihren Modellen verwenden. Ihr Modell wird erwarten, dass ein Select aber Ihre Aktion wahrscheinlich zurückkehrt ID des Objekts ausgewählt - dies wird wirft den

System.MissingMethodException: kein parameterlosen Konstruktor definiert für dieses Objekt.

Sie können es mit etwas in dieser Richtung handhaben:

[Bind(Exclude = "List")] 
public class UserFormModel 
{ 
    public SelectList List { get; set; } 
    public int SelectedItem { get; set; } 
} 

nur leicht zu übersehen und kann einen Parameter Konstruktor Fehler Jagd nach frustrierend sein - so wollte ich das hier beachten.

+0

Danke, ich glaube, das war eigentlich die Ursache des Problems – PatG

+0

@PatG - Nicht genau dein Problem, aber es ist nah dran. Ihr wirkliches Problem war, dass Sie 'Html.DropDownListFor (m => m.RoleList, Model.ActiveList)' in Ihrer Ansicht verwendet haben. 'm.RoleList' ist in Ihrem Modell als SelectList definiert, aber Ihre Ansicht gibt ein ausgewähltes Objekt zurück. Sie verwenden auch die gleiche RoleList für alle Ihre Dropdowns, was auch etwas verwirrend ist (sie werden sich gegenseitig überschreiben). Das hatte ich neulich nicht bemerkt. –

0

Erstens, es ist eine schlechte Idee, den Datenzugriff in Ihrem Modell zu tun. Models sollten dumm sein, und sie sollten sich nicht selbst bevölkern. Es ist in Ordnung, leere Listen und solche im Konstruktor zu erstellen, aber keinen Datenzugriff.

Zweitens, wo Sie Datenzugriff tun, entledigen Sie sich nicht des Kontextes. Sie sollten eine using-Anweisung verwenden, um Dispose für den Kontext automatisch aufzurufen.

Drittens verwenden Sie nicht das Attribut "PropertiesMustMatch", sondern das Compare-Attribut für die ConfirmPassword-Eigenschaft.

Keines dieser Dinge sollte den Fehler verursachen, den Sie sehen, obwohl ich mir über das Attribut nicht sicher bin. Versuchen Sie es zu entfernen und zu sehen, ob es funktioniert.

+0

Vielen Dank für Ihre Antwort. Ich habe den Haltepunkt bei der ersten Anweisung der Post-Methode nicht getroffen. Meine Anwendung bricht nicht einmal, wenn ich diesen Fehler beim Debuggen bekomme. – PatG

+0

@PatG - ich habe meine Nachricht aktualisiert, nachdem Sie die Stack-Trace bereitgestellt haben. Der Fehler tritt in der Modellmappe auf, daher handelt es sich um ein Problem mit Ihrem Modell. Das einzige potenzielle Problem, das ich sehe, ist das Attribut PropertiesMustMatch, entfernen Sie es und sehen Sie, ob das das Problem ist. –

+0

Ich habe das Attribut auskommentiert, aber ich komme immer noch mit dem gleichen Fehler. Ich finde das seltsam, dass es den Debugger nicht pausiert, wenn dieser Fehler aufgerufen wird. – PatG

Verwandte Themen