2

当使用 VS2013 并创建一个新的 Web 项目(MVC5 / .net 4.5 / EF6)时,默认项目模板带有一个标准的 AccountController,它实现了“管理”操作。据我所知,没有显式传递给管理视图的视图模型(实际上,视图本身没有强类型模型)。

事情是; 管理视图内部是以下行;

@Html.Partial("_ChangePasswordPartial")

在查看该特定视图时,它会显示一个强类型视图模型:

@model MyProject.Models.ManageUserViewModel

然而,在项目的任何地方,我都找不到这个视图模型被填充或发送到那个局部视图。有人能告诉我视图从哪里获取这个视图模型(以及视图模型是从哪里构造的)吗?

原因是; 我正在尝试修改“管理”视图以采用我自己的视图模型,然后想将该视图模型的属性传递给“_ChangePasswordPartial”,所以它看起来像这样:

public ActionResult Manage()
{
    CustomViewModel viewModel = bLogic.CreateViewModel();
    viewModel.ChangePasswordViewModel = bLogic.CreatePasswordViewModel();
    return View(viewModel);
}

然后在我的“管理”视图中,有:

@Html.Partial("_ChangePasswordPartial", Model.ChangePasswordViewModel)
4

1 回答 1

3

我认为您的问题在于了解该模型的用途。

“但在项目中我找不到这个视图模型被填充或发送到那个局部视图”

无需填充_ChangePasswordPartial视图模型,因为部分视图最初(GET)中没有使用任何数据。

提交表单 (POST) 后使用视图模型。它根据用户提交的数据在AccountController.Manage(ManageUserViewModel 模型)中创建/填充,这是通过模型绑定器自动完成的(您也可以创建自定义绑定器)。

然后在Manage(ManageUserViewModel model)操作中验证模型,如果模型有效,最终用于更改/添加用户密码。如果模型状态无效,模型将连同用于显示验证错误的模型状态一起返回到管理视图:

// If we got this far, something failed, redisplay form
return View(model);

这将返回Manage视图,该视图又调用_ChangePasswordPartial视图,该视图现在固有地具有填充的ManageUserViewModel模型。

现在为什么没有模型从 Manage 视图显式传递给 Partial ?

很简单,局部视图继承了父视图的模型:在 MVC 中,局部视图是否继承其父视图的模型?

于 2013-11-11T08:02:02.837 回答