我有一个带有Get,Save和Create操作的控制器。这些操作将项目类型作为参数。这只是一个字符串,指定我们正在处理的项目类型。
每个项目类型都有一个子控制器,每个子控制器都实现子控制器接口(IChildController),它具有Get,Save和Create方法。
每个子控制器都根据其类型(ItemTypeController)命名。当我从父控制器获取项目时,我可以这样做:
Get(string itemType, int id)
{
return RedirectToAction("Get", itemType, new { id });
}
子控制器中的Get方法有一个ActionResult返回类型(返回一个Partival View),所以这没有问题。
然而,当我保存一个项目时,所有子项都被创建,然后返回到父对象并存储在其中,这样就可以仅对父项执行保存(NHibernate将处理级联记录)。
如何在不首先实例化所有子控制器的情况下从这些方法返回对象。例如,我希望能够调用Save(itemType,item)
Save(string itemType, Item item)
{
return RedirectToAction("Save", itemType, new { item });
}
然后我们将找到适当的子控制器(itemTypeController),执行Save(item)方法,然后将item(item)返回给父控制器。
Save(Parent parent)
{
IRepository<Parent> _parent;
var item = new Parent();
item.Id = parent.Id;
item.Children = parent.Children.AddAll(parent.Children.Select(Save(parent.ChildType)); // save each child and add it to the parent's child collection
return _parent.Save(item);
}
Save(Child child)
{
IRepository<Child> _child;
var item = new Child();
item.Id = child.Id;
return _child.Save(item);
}
实现这一目标的最佳解决方案是什么?提前感谢您的帮助。
编辑
我如何将复杂对象转换为ViewModel。例如,包含Child类型的子项的Parent对象。
在ParentTypeController中我们有:
ParentViewModel ToViewModel(Parent parent)
{
var model = new ParentViewModel();
model.Id = parent.Id;
model.Children = parent.Children.Select(ToViewModel); //Use the ToViewModel method in the ChildTypeController
return model;
}
ChildTypeController:
ChildViewModel ToViewModel(Child child)
{
var model = new ChildViewModel();
model.Id = child.Id;
return model;
}
答案 0 :(得分:0)
首先,您应该不使用RedirectToAction()
作为一般模式。来自MSDN:
返回对浏览器的HTTP 302响应,从而导致浏览器 向指定的操作发出GET请求。
因此,对于用户对您的应用程序进行的每个请求,您都迫使他们实际使两个!如果你想使用重载方法,你可以在你的控制器中这样做;您不需要导致浏览器重定向。
我认为一旦你摆脱了这种模式,剩下的就会自然而然地出现。在我自己的项目中,我发现通常最好分两步执行数据库操作 - (1)创建或更新,然后(2)再次从数据库请求“新鲜”对象状态。
答案 1 :(得分:0)
认为定义正确的抽象有问题。不要将控制器用于此类行为或交互。你已经有了一个存储库,所以让它来做繁重的工作。
除非有充分的理由,否则不应该从操作中调用操作。 http请求映射到(功能)操作。操作可以使用模型(在Mvc中)并使用返回值来创建响应。
不确定您在控制器中想要或需要此父/子层次结构的原因。也许你可以解释为什么需要它。
修改强> 试试AutoMapper“.NET中基于约定的对象 - 对象映射器”。将对象图转换为其他对象图。适用于简单和复杂的转换。