C# 如何从使用RedirectToAction执行的方法返回对象?

C# 如何从使用RedirectToAction执行的方法返回对象?,c#,asp.net-mvc,redirecttoaction,C#,Asp.net Mvc,Redirecttoaction,我有一个带有获取、保存和创建操作的控制器。这些操作将项类型作为参数。这只是一个字符串,指定我们正在处理的项目的类型 每个项类型都有一个子控制器,每个子控制器都实现了具有Get、Save和Create方法的子控制器接口(IChildController) 每个子控制器都根据其类型命名(ItemTypeController)。当我从父控制器获取项目时,我可以这样做: Get(string itemType, int id) { return RedirectToAction("Get", i

我有一个带有获取、保存和创建操作的控制器。这些操作将项类型作为参数。这只是一个字符串,指定我们正在处理的项目的类型

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

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

Get(string itemType, int id)
{
    return RedirectToAction("Get", itemType, new { id });
}
子控制器中的Get方法有一个ActionResult返回类型(返回一个Partival视图),因此它可以正常工作

然而,当我保存一个项目时,所有的子项都会被创建,然后返回到父对象并存储在其中,这样就只能在父对象上执行保存(NHibernate将负责级联记录)

如何从这些方法返回对象而不首先实例化所有子控制器。例如,我希望能够调用Save(itemType,item)

然后我们将找到适当的子控制器(itemTypeController),执行方法Save(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);
}
ChildTypeController:

ChildViewModel ToViewModel(Child child)
{
    var model = new ChildViewModel();
    model.Id = child.Id;
    return model;
}

首先,您应该不要使用
RedirectToAction()
作为常规模式。发件人:

向浏览器返回HTTP 302响应,这会导致浏览器 对指定的操作发出GET请求

因此,对于用户对您的应用程序发出的每一个请求,您都在强迫他们实际发出两个请求!如果你想使用重载方法,你可以在你的控制器内这样做;您不需要导致浏览器重定向


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

我想您在定义正确的抽象时遇到了问题。不要将控制器用于此类行为或交互。您已经有了一个存储库,所以让它来完成繁重的工作

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

不确定为什么希望或需要控制器中的此父/子层次结构。也许你可以解释一下你为什么需要它

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

您最初的问题问了一件事,而您的编辑问了一个完全不同的问题。这些应该是分开的。@bfir3:你设法让它工作了吗?你能批准下面的一个答案吗?
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;
}
ChildViewModel ToViewModel(Child child)
{
    var model = new ChildViewModel();
    model.Id = child.Id;
    return model;
}