0

我有一个视图页面,该页面具有不同模型的不同部分视图。我创建了一个模型类,它将调用其他类,因此我可以在主视图页面上使用它。但我的问题是,当我尝试更改密码时,它给了我一个错误,我正在传递一个模型,我需要传递另一个模型。我相信我的结构是正确的,但不确定是什么导致了这个问题。

主视图:

 @model Acatar.Models.ProfileModel

        @{
            ViewBag.Title = "ProfileAccount";
        }
        @{ Html.RenderAction("_PlayNamePartial"); }
        @{ Html.RenderAction("_UsernamePartial", "Account");}
        @{ Html.RenderAction("_TalentsPartial", "Account");}

            @if (ViewBag.HasLocalPassword)
            {
                @Html.Partial("_ChangePasswordPartial")
            }
            else
            { 
                @Html.Partial("_SetPasswordPartial")
            }

Profile Model:包含我创建的模型

public class ProfileModel
    {
        public LocalPasswordModel LocalPasswordModel { get; set; }
        public PlayNameModel PlayNameModel { get; set; }
        public UsernameModel UsernameModel { get; set; }
        public TalentsModel  TalentsModel { get; set; }
    }

控制器:

public ActionResult Profile(ManageMessageId? message)
    {
        ViewBag.StatusMessage =
            message == ManageMessageId.ChangePasswordSuccess ? "Your password has been changed."
            : message == ManageMessageId.SetPasswordSuccess ? "Your password has been set."
            : message == ManageMessageId.RemoveLoginSuccess ? "The external login was removed."
            : "";
        ViewBag.HasLocalPassword = OAuthWebSecurity.HasLocalAccount(WebSecurity.GetUserId(User.Identity.Name));
        ViewBag.ReturnUrl = Url.Action("Profile");
        return View();
    }

邮政:

    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Profile(LocalPasswordModel model)
    {
        bool hasLocalAccount = OAuthWebSecurity.HasLocalAccount(WebSecurity.GetUserId(User.Identity.Name));
        ViewBag.HasLocalPassword = hasLocalAccount;
        ViewBag.ReturnUrl = Url.Action("Profile");
        if (hasLocalAccount)
        {
            if (ModelState.IsValid)
            {
                // ChangePassword will throw an exception rather than return false in certain failure scenarios.
                bool changePasswordSucceeded;
                try
                {
                    changePasswordSucceeded = WebSecurity.ChangePassword(User.Identity.Name, model.OldPassword, model.NewPassword);
                }
                catch (Exception)
                {
                    changePasswordSucceeded = false;
                }

                if (changePasswordSucceeded)
                {
                    return RedirectToAction("Profile", new { Message = ManageMessageId.ChangePasswordSuccess });
                }
                else
                {
                    ModelState.AddModelError("", "The current password is incorrect or the new password is invalid.");
                }
            }
        }
        else
        {
            // User does not have a local password so remove any validation errors caused by a missing
            // OldPassword field
            ModelState state = ModelState["OldPassword"];
            if (state != null)
            {
                state.Errors.Clear();
            }

            if (ModelState.IsValid)
            {
                try
                {
                    WebSecurity.CreateAccount(User.Identity.Name, model.NewPassword);
                    return RedirectToAction("Profile", new { Message = ManageMessageId.SetPasswordSuccess });
                }
                catch (Exception e)
                {
                    ModelState.AddModelError("", e);
                }
            }
        }

        return View(model);
    }

查看密码更改页面:

@model Project.Models.LocalPasswordModel


@using (Html.BeginForm("Profile", "Account")) {
    @Html.AntiForgeryToken()
    @Html.ValidationSummary()

    <fieldset>
        <legend>Change Password Form</legend>

                @Html.LabelFor(m => m.OldPassword)
                @Html.PasswordFor(m => m.OldPassword)

                @Html.LabelFor(m => m.NewPassword)
                @Html.PasswordFor(m => m.NewPassword)

                @Html.LabelFor(m => m.ConfirmPassword)
                @Html.PasswordFor(m => m.ConfirmPassword)

       <br/>
        <input class="btn btn-small" type="submit" value="Change password" />
    </fieldset>

我得到的错误: The model item passed into the dictionary is of type 'Project.Models.LocalPasswordModel', but this dictionary requires a model item of type 'Project.Models.ProfileModel'.

4

1 回答 1

0

尝试在@Html.Partial方法中指定模型。(请原谅我的语法,我现在没有 IDE

        @if (ViewBag.HasLocalPassword)
        {
            @Html.Partial("_ChangePasswordPartial",Model.LocalPasswordModel)
        }
        else
        { 
            @Html.Partial("_SetPasswordPartial",Model.LocalPasswordModel)
        }

(我猜第二个视图也使用相同的模型) 但是我看不到任何模型从您的控制器传递到您的视图中,您应该传递一个模型来查看

public ActionResult Profile(ManageMessageId? message)
    {
        ViewBag.StatusMessage =
            message == ManageMessageId.ChangePasswordSuccess ? "Your password has been changed."
            : message == ManageMessageId.SetPasswordSuccess ? "Your password has been set."
            : message == ManageMessageId.RemoveLoginSuccess ? "The external login was removed."
            : "";
        ViewBag.HasLocalPassword = OAuthWebSecurity.HasLocalAccount(WebSecurity.GetUserId(User.Identity.Name));
        ViewBag.ReturnUrl = Url.Action("Profile");

        var ProfileModel = new ProfileModel();
        ProfileModel.LocalPasswordModel = populateFromDB();
        return View(ProfileModel);
    }

或者考虑创建一个动作结果来渲染这个局部视图,就像你对其他局部视图所做的那样。(如果这里没有其他使用意图Html.partial

           @if (ViewBag.HasLocalPassword)
            {
                @Html.RenderAction("_ChangePasswordPartial")
            }
            else
            { 
                @Html.RenderAction("_SetPasswordPartial")
            }
于 2013-02-13T18:24:57.517 回答