1

私は現在、デフォルトのMVCプロジェクトの登録コンポーネントを変更して、プロジェクトにもう少し対応しようとしています。これを行うために、RegisterModel、Register.aspx、およびAccountControllerを変更しました。レジスタービューは問題なく表示できますが、送信するとタイトルにエラーが表示され、問題の原因がほとんどまたはまったくわかりません。誰かが私がこれを修正するために正しい方向に私を操縦してくれますか?

更新: 内部例外も追加しました

更新2: MystereManの提案により良い形になるようにコードを変更しました。モデルをロジックから分離するために、フォームのViewModelを作成しました。まだ同じエラーが発生します。

モデル、ビュー、コントローラーのコードは次のとおりです。

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; }

 }    

AccountController:

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");
    }
}

内部例外:

[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
4

2 に答える 2

2

私はあなたが今これを機能させていることを知っています-それは素晴らしいことです。

ここにメモを投稿したかっただけです。モデルでSelectListを使用するときは注意してください。モデルはSelectListを期待しますが、アクションはおそらく選択されたオブジェクトのIDを返します-これは

System.MissingMethodException:このオブジェクトにパラメーターなしのコンストラクターが定義されていません。

あなたはこれらの線に沿った何かでそれを扱うことができます:

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

見逃しやすく、パラメーターコンストラクターエラーを追いかけるのにイライラする可能性があるので、ここで注意したいと思います。

于 2012-04-11T17:07:38.927 に答える
0

まず、モデルでデータアクセスを行うことはお勧めできません。モデルは馬鹿げていると思います、そして彼らは彼ら自身に住むべきではありません。コンストラクターで空のリストなどを作成してもかまいませんが、データアクセスは行わないでください。

第二に、データアクセスを行っている場合、コンテキストを破棄しているわけではありません。コンテキストでDisposeを自動的に呼び出すには、そこにusingステートメントが必要です。

3番目に、その「PropertiesMustMatch」属性を使用せず、代わりに、ConfirmPasswordプロパティのCompare属性を使用します。

属性についてはよくわかりませんが、これらのいずれも、表示されているエラーの原因にはなりません。それを削除して、機能するかどうかを確認してみてください。

于 2012-04-10T16:59:38.240 に答える