2012-07-09 63 views
-1

我有一个获取,保存和创建操作的控制器。这些操作将参数作为项目类型。这只是一个字符串,用于指定我们正在处理的项目的类型。如何从使用RedirectToAction执行的方法返回对象?

每个这些项目类型都有一个子控制器,每个子控制器都实现了具有Get,Save和Create方法的子控制器接口(IChildController)。

每个子控制器都根据其类型(ItemTypeController)进行命名。当我从我的父控制器获得一个项目,我可以做这样的:

Get(string itemType, int id) 
{ 
    return RedirectToAction("Get", itemType, new { id }); 
} 

在孩子控制器GET方法有一个ActionResult返回类型(返回Partival查看)所以这个工作没有问题。

但是,当我保存一个项目时,所有的子项都被创建,然后返回到父项对象并存储在其中,这样就可以对父项进行保存(并且NHibernate将处理级联记录) 。

如何从这些方法中返回对象,而无需首先实例化所有子控制器。例如,我希望能够调用保存(ITEMTYPE,项目)

Save(string itemType, Item item) 
{ 
    return RedirectToAction("Save", itemType, new { item }); 
} 

,然后我们会找到合适的子控制器(itemTypeController),执行方法保存(项目),然后返回项目(项目)回到父控制器。

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

达到这个目标的最佳解决方案是什么?预先感谢您的帮助。

编辑

我怎么会去复杂的对象转换成的ViewModels。例如,一个包含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

您的第一个问题提出了一件事,而您的编辑提出了完全不同的问题。这些应该是分开的。 – Yuck 2012-07-09 17:11:20

+0

@ bfir3:你设法让它工作吗?你能否批准下面的答案之一? – 2012-07-12 12:48:28

回答

0

首先,你应该使用RedirectToAction()作为一种普遍现象,你是这样的。从MSDN

返回一个HTTP 302响应于所述浏览器,这会导致浏览器 作出GET请求到指定的操作。

所以对用户进行应用程序的每一个请求,你迫使他们实际上使!如果你想使用重载的方法,你可以在你的控制器中这样做。您不需要导致浏览器重定向。

我想一旦你解放了自己的这种模式,其余的就会自然出现。在我自己的项目中,我发现通常最好分两步执行数据库操作 - (1)创建或更新,然后(2)再次从数据库请求“新鲜”对象状态。

0

认为您在定义正确的抽象时遇到了问题。不要将控制器用于这种行为或交互。你已经拥有一个仓库,所以让它完成繁重的工作。

你不应该从动作中调用动作,除非有很好的理由。 http请求映射到(功能性)操作。一个动作可以使用模型(在Mvc中)并使用返回值来创建响应。

不确定为什么你想要或需要你的控制器中的这个父/子层次结构。也许你可以解释为什么你需要它。

编辑 尝试AutoMapper“在.NET中以公约为基础对象的对象映射器”。将对象图转换为其他对象图。适用于简单和复杂的转换。