使用VS2013并创建新的Web项目(MVC5 / .net 4.5 / EF6)时,默认项目模板附带一个标准AccountController,用于实现“Manage”操作。 据我所知,没有显式传递给Manage视图的viewmodel(实际上,视图本身没有强类型模型)。
事情是; “管理”视图内部是以下行;
@Html.Partial("_ChangePasswordPartial")
在查看该特定视图时,它会将强类型视图模型显示为;
@model MyProject.Models.ManageUserViewModel
然而,在项目中没有任何地方可以找到这个视图模型被填充或发送到该局部视图。有人能告诉我视图是从哪个视图模型得到的(以及视图模型的构造)?
原因是;我试图修改“管理”视图以获取我自己的viewmodel,然后想要将该viewmodel的属性传递给“_ChangePasswordPartial”,所以它看起来像这样:
public ActionResult Manage()
{
CustomViewModel viewModel = bLogic.CreateViewModel();
viewModel.ChangePasswordViewModel = bLogic.CreatePasswordViewModel();
return View(viewModel);
}
然后在我的“管理”视图中,有:
@Html.Partial("_ChangePasswordPartial", Model.ChangePasswordViewModel)
答案 0 :(得分:3)
我认为您的问题在于了解该模型的用途。
“然而在项目中没有任何地方可以找到这个视图模型被填充或发送到该部分视图”
没有必要填充 _ChangePasswordPartial 视图模型,因为在部分视图中最初没有使用数据(GET)。
在提交表单(POST)后使用视图模型。它从用户提交的数据中创建/填充在 AccountController.Manage(ManageUserViewModel model)中,这是通过Model Binders自动完成的(您也可以创建自定义的)。
在管理(ManageUserViewModel模型)操作中,模型随后会被验证,并最终用于在模型有效时更改/添加密码给用户。如果模型状态无效,模型将返回管理视图,以及用于显示验证错误的模型状态:
// If we got this far, something failed, redisplay form
return View(model);
这将返回管理视图,该视图又会调用 _ChangePasswordPartial 视图,该视图本身现在具有已填充的 ManageUserViewModel 模型。
现在为什么没有模型从Manage视图显式传递给Partial?
很简单,部分视图继承了父视图的模型:In MVC do partial views inherit the models of their Parent views?