Asp.net mvc 4 视图错误中的多个模型

Asp.net mvc 4 视图错误中的多个模型,asp.net-mvc-4,model,viewmodel,asp.net-mvc-viewmodel,Asp.net Mvc 4,Model,Viewmodel,Asp.net Mvc Viewmodel,我有一个视图页面,它具有不同模型的不同部分视图。我创建了一个模型类,它将调用其他类,以便我可以在主视图页面上使用它。但我的问题是,当我试图更改密码时,它会给我一个错误,即我正在传入一个模型,而我需要传入另一个模型。我相信我的结构是正确的,但不确定是什么导致了这个问题 主要观点: @model Acatar.Models.ProfileModel @{ ViewBag.Title = "ProfileAccount"; }

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

主要观点:

 @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")
            }
配置文件模型:包含我创建的模型

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();
    }
职位:

密码更改的查看页面:

@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>
@model Project.Models.LocalPasswordModel
@使用(Html.BeginForm(“Profile”、“Account”)){
@Html.AntiForgeryToken()
@Html.ValidationSummary()
更改密码表格
@LabelFor(m=>m.OldPassword)
@Html.PasswordFor(m=>m.OldPassword)
@LabelFor(m=>m.NewPassword)
@Html.PasswordFor(m=>m.NewPassword)
@LabelFor(m=>m.ConfirmPassword)
@Html.PasswordFor(m=>m.ConfirmPassword)

我收到的错误:
传入字典的模型项的类型为“Project.Models.LocalPasswordModel”,但此字典需要“Project.Models.ProfileModel”类型的模型项。
尝试在
@Html.Partial
方法中指定模型。(请原谅我的语法,我现在没有IDE)

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

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。


您在哪里传递您的配置文件模型?@ssilas777在主视图页面上,但您没有从控制器传递任何内容-view();您应该填充您的配置文件模型,并像view(model)一样传递它。所有其他局部视图都在使用Renderaction,因此不会出现错误,但在@Html.partial中,它需要模型。它使sense@ssilas777因此,您认为在我的
…配置文件(ManageMessageId?message)
中,我应该包括
var model=newprofilemodel();
然后在return:
返回视图(model)中是的,你也应该填充Multual.LoalPaseWordMod模型,因为我们将在我们的视图中使用这个模型。或者,你可以考虑在你做其他视图时将@ HTML.TeaMe部分变为HTML.ReNeDebug。当我尝试这一点时,我会得到错误:<代码>对象引用不被设置为对象的实例。我之前的评论是,您没有将任何模型从控制器传递到主视图,这导致了此错误。在我进行这些更改时,错误消息中的模型名称仍然相同,但已翻转。在此更改中,您进行了哪些更改,这里有2个@Html.Partial方法。请确保您将准确的模型传递给这些视图。对不起但我想我只是更困惑了我自己,我得到了同样的两个错误。
        @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);
    }
           @if (ViewBag.HasLocalPassword)
            {
                @Html.RenderAction("_ChangePasswordPartial")
            }
            else
            { 
                @Html.RenderAction("_SetPasswordPartial")
            }