>我有三个视图模型来编辑同一个域对象。我使用自动映射器从域对象映射到视图模型。
获取
if (Roles.IsUserInRole("administrators"))
{
viewName = "EditAdmin";
editOrder = Mapper.Map<Order, ViewModels.Order.Admin_ViewModel>(order);
}
else if (Roles.IsUserInRole("administrators"))
{
viewName = "EditTechnician";
editOrder = Mapper.Map<Order, ViewModels.Order.Technician_ViewModel>(order);
}
else if (Roles.IsUserInRole("clients"))
{
viewName = "EditClient";
editOrder = Mapper.Map<Order, ViewModels.Order.Client_ViewModel>(order);
}
RedirectToRoute(viewName, editOrder);
发布是否可以对所有视图模型使用相同的方法?可能通过让ViewModels继承"ViewModelbase"?尝试过这个没有成功:(
提前非常感谢!
编辑:这是我的方法现在的样子:
public ActionResult EditAdmin(ViewModels.Order.Admin_ViewModel model) {...}
有什么想法吗?
更新:我无法理解如何使用构图(尝试了几个小时)。所以我用这个去清理一下。这些是我的三个视图模型的处理程序:
[HttpPost]
[Authorize(Roles = "administrators")]
public ActionResult EditAdmin(Admin_ViewModel model)
{
return SaveViewModel(model);
}
[HttpPost]
[Authorize(Roles = "technicians")]
public ActionResult EditTechnician(Technician_ViewModel model)
{
return SaveViewModel(model);
}
[HttpPost]
[Authorize(Roles = "clients")]
public ActionResult EditClient(Client_ViewModel model)
{
return SaveViewModel(model);
}
保存视图模型如下所示:
protected ActionResult SaveViewModel(dynamic model)
{ ... }
我对这个解决方案感觉不好。你能给我一些指示吗?
我直言 - ViewModel应该简单明了。如果你引入继承,它会变得复杂。
我建议你使用组合来构建你想要的视图模型。因此,如果用户处于特定角色中,则在发布页面时,与该角色无关的对象将为 null。有了它,您可以坚持使用一种 POST 方法而不是多种方法。
更新:如果您确实想在 ViewModel 中继承。自定义模型绑定器是解决方案,如果默认模型绑定器不起作用