对多个视图模型使用相同的actionresult方法?

时间:2012-05-09 13:16:52

标签: asp.net-mvc viewmodel

我有三个viewmodel来编辑同一个域对象。 我使用AutoMapper映射到域对象的视图模型。

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 是否可以对所有视图模型使用相同的方法? 可能让ViewModel继承“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);
}

SaveViewModel如下所示:

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

我对这个解决方案感觉不太好。你能给我一些指示吗?

1 个答案:

答案 0 :(得分:1)

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

我建议您使用合成来构建所需的ViewModel。因此,如果用户处于特定角色,则在发布页面时,与角色无关的对象将为空。有了它,你可以坚持使用一种POST方法,而不是很多。

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