2012-05-09 56 views
2

我有三个viewmodels编辑相同的域对象。 我使用AutoMapper从域对象映射到视图模型。对多个视图模型使用相同的actionresult方法?

GET

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

POST 是否可以用于所有的ViewModels同样的方法? 可能通过让ViewModel继承“ViewModelbase”? 没有成功:(

提前感谢试过这种

编辑:! 这就是我的方法貌似现在:

public ActionResult EditAdmin(ViewModels.Order.Admin_ViewModel model) {...} 

任何想法

更新: 我无法理解如何使用组合(尝试了几个小时),所以我用它来清理一下,这些是处理程序我的三个的ViewModels:

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

SaveViewModel看起来是这样的:

protected ActionResult SaveViewModel(dynamic model) 
{ ... } 

我不觉得好这个解决方案。你能给我一些指点吗?

回答

1

恕我直言 - ViewModel应该简单明了。如果你引入继承,它会变得复杂。

我建议你使用构图构建你想要的ViewModel。因此,如果用户处于特定角色中,那么与该角色无关的对象在发布页面时将为空。有了这个,你可以坚持一种POST方法而不是很多。

更新: 如果你真的想在ViewModel中有继承。自定义模型绑定器是解决方案,如果默认的一个不起作用

+0

请参阅上面的我的更新。谢谢! –

+0

@JimH请你分享三个ViewModels,然后我可以试一试。 – Rajeesh

相关问题