【问题标题】:How can I return an object from a method executed with RedirectToAction?如何从使用 RedirectToAction 执行的方法中返回对象?
【发布时间】:2012-07-09 12:56:39
【问题描述】:

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

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

每个子控制器都根据其类型 (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;
}

【问题讨论】:

  • 您最初的问题提出了一个问题,而您的编辑提出了一个完全不同的问题。这些应该是分开的。
  • @bfir3:你设法让它工作了吗?您能批准以下答案之一吗?

标签: c# asp.net-mvc redirecttoaction


【解决方案1】:

首先,您应该像现在这样使用RedirectToAction() 作为一般模式。来自MSDN

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

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

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

【讨论】:

    【解决方案2】:

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

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

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

    编辑 试试AutoMapper“.NET 中基于约定的对象-对象映射器。”将对象图转换为其他对象图。非常适合简单和复杂的转换。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-01
      • 1970-01-01
      • 2016-01-21
      相关资源
      最近更新 更多