0

我是整个 MVC 3 风格编码的新手。我遇到了一个问题,但首先这是我的网站布局方式。

_Layout.cshtml 包含

        @if (Request.IsAuthenticated)
        {
            <div class="span2">
                @Html.Partial("_NavigationPartial")
            </div>
            <div class="span10">
                @RenderBody()
            </div>
        }
        else
        { 
            @RenderBody()
        }

@RenderBody将显示我的 Profile.cshtml 文件,其中包含以下内容:

@{
    ViewBag.Title = "My Profile";
}
<div class="row-fluid well">
    <div class="page-header">
        <h1>
            Profile</h1>
    </div>
    @{ 
        Html.RenderPartial("ChangePersonalInformationPartial");
        Html.RenderPartial("ChangePasswordPartial");
        }
</div>

如您所见,我有两个部分(一个用于更改个人信息,另一个用于更改密码)。

这些 Partials 中的每一个都使用它自己的 Model (ChangePersonalInformationModelChangePasswordModel)。

当我点击提交时,我的问题出现了ChangePasswordPartial,它重新加载了 _Layout.cshtml 页面,但这次只加载了ChangePasswordPartial.cshtml。我需要它来加载 Profile.cshtml。但是,如果我继续在我AccountController.csreturn View();to下进行更改,return View("Profile");我会收到一条错误消息:

传入字典的模型项的类型为“PROJECT.Models.ChangePasswordModel”,但该字典需要“PROJECT.Models.ChangePersonalInformationModel”类型的模型项。

我该如何解决这个问题?

谢谢!

4

1 回答 1

2

基本上,您必须在ChangePassword保存密码信息后重定向到操作中的配置文件操作。

更新:

首先,您应该有一个通用模型说ProfileModel包含ChangePasswordModeland ChangePersonalInformationModel

因此,这里是显示用于查看和编辑的配置文件信息的操作。

// this action will returns a views that displays profile info
public ViewResult Profile(string username)
{
  ProfileModel model = .. get the profile from database based on username

  return View(model);
}

// this action will returns the profile info for editing or adding a new profile
public ViewResult EditProfile(string username)
{
   .. if the profile already exists get from database
   ProfileModel model = 

   .. if this is a new profile create an empty model
   ProfileModel model = new ProfileModel();
   model.ChangePasswordModel = new ChangePasswordModel();
   model.ChangePersonalInformationModel = new ChangePersonalInformationModel();

   return View(model);
}

你的EditProfile.cshtml会是这样的

@model Models.ProfileModel

...
@{ 
   Html.RenderPartial("ChangePersonalInformationPartial", 
                                  Model.ChangePersonalInformationModel);
   Html.RenderPartial("ChangePasswordPartial", Model.ChangePasswordModel);
}
...

这将是你的ChangePassword行动

[HttpPost]
public ActionResult ChangePassword(ChangePasswordModel model)
{
  if(ModelState.IsValid)
  {
     // save the ChangePasswordModel to database and display the profile info
     // or even you can redirect to EditProfile for more editing
     return RedirectToAction("Profile"); 
  }      

   .. there are validation errors so get the complete profile model from database
   .. the ChangePasswordModel form will be filled by the details entered in the form
   .. and not from the db details this will be taken care by the framework itself.
   ProfileModel model = 
   return View("EditProfile", model);     
}
于 2012-06-21T17:42:31.487 回答