MVC3 One View - 多个部分视图 - 每个部分视图一个模型

时间:2012-06-21 17:33:57

标签: asp.net-mvc asp.net-mvc-3 razor

我是整个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中的每一个都使用它自己的模型(ChangePersonalInformationModelChangePasswordModel)。

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

  

传递到字典中的模型项是类型的   'PROJECT.Models.ChangePasswordModel',但这个字典需要一个   “PROJECT.Models.ChangePersonalInformationModel”类型的模型项。

如何解决此问题?

谢谢!

1 个答案:

答案 0 :(得分:2)

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

<强>更新

首先,你应该有一个通用模型说ProfileModel,它包含了ChangePasswordModelChangePersonalInformationModel

以下是显示用于查看和编辑的配置文件信息的操作。

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