【问题标题】:ASP.Net MVC - post from one controller to another (action to action)ASP.Net MVC - 从一个控制器发布到另一个(动作到动作)
【发布时间】:2010-04-30 16:30:37
【问题描述】:

是否可以从控制器“产品”中的“保存”操作到控制器“类别”中的“保存所有”操作进行发布??

并且还传递了一个 FormCollection 作为参数

【问题讨论】:

    标签: asp.net-mvc post


    【解决方案1】:

    您可以在您的视图中声明这样的表单,并可以指定您希望的任何控制器或操作。

    Html.BeginForm("SaveAll", "Category", FormMethod.Post);
    

    如果你在控制器中,那么你可以使用。

    TempData["Model"] = Model;
    RedirectToAction("SaveAll", "Category");
    

    【讨论】:

    • 我认为 OP 试图做的是从产品视图更新他的类别,并且他希望保持一切干燥。
    • 不是这个...如果我已经在一个动作中并在其他控制器中发布另一个动作,我需要...
    • @AndreMiranda,好的,但最终目标不是保存您的类别吗?只要它发生,你是否关心它是如何发生的,使用最佳实践?你想达到什么目的?如果您只需要调用另一个控制器方法,那可以很容易地完成,而无需创建 POST 请求。
    • @AndreMiranda:您可以使用 TempData 传递您的模型。
    • TempData - 我没有这个。绝对是一个好用的东西。很好的答案+1
    【解决方案2】:
    public class Product : Controller
    {
        ...
        [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult Save(FormCollection productValues)
        {
            ...
            RedirectToAction("SaveAll", "Category", new { formValues = productValues });
        }
        ...
    }
    
    public class Category : Controller
    {
        ...
        public ActionResult SaveAll(FormCollection formValues)
        {
            ...
        }
    }
    

    假设您正在产品的上下文中执行 POST。

    【讨论】:

      【解决方案3】:

      我要么直接从 Product 控制器的 Save 方法更新存储库中的类别,要么在其自己的方法中重构 Save Categories 功能,然后从两个控制器方法中调用它。

      【讨论】:

      • 存储库不是我的目标......对不起
      • +1 表示“重构”,为此我使用了整个段落。
      【解决方案4】:

      由于 POST 是 HTTP 请求的动词,因此只有在 .Save() 方法启动到适当的 .SaveAll()(如 http://..../Category/SaveAll)路由的 HTTP 环回连接并通过时,这才有意义(如所写)表单集合作为请求的一部分。这是愚蠢的,不建议这样做,因为这会破坏您对该控制器进行单元测试的能力

      但是,如果您的意思是要调用.SaveAll() 并将其渲染结果返回给客户端,则可以使用.RenderAction() 并将.Save() 接收到的模型或表单集合作为参数传递。

      或者,在服务器端,只需实例化 Category 控制器并调用其 .SaveAll() 方法,再次将 .Save() 接收到的模型作为参数传递。

      public ActionResult Save(MyModel m)
      {
          Category cat = new Category();
      
          return cat.SaveAll(m);
      }
      

      但是,您必须从该调用中获取结果,并确保结果视图正确处理它。

      如果这是您想要做的,值得注意的是,您应该将执行保存的.SaveAll() 方法的代码分离到一个专用的业务逻辑层中,而不是放在控制器中。理论上,所有这些功能都应该可以在不同的控制器中使用,或者在可以包含在其他应用程序中的库中使用。

      【讨论】:

      • 同意,BLL 就是这样做的地方。
      • 如果你对控制器进行单元测试,那么你的控制器做的太多了。
      【解决方案5】:

      将以下代码放入您的 Product 控制器中:

      return RedirectToAction("SaveAll", "Category")
      

      这里,"SaveAll" 是操作名称,"Category" 是控制器名称。 然后,用户将被重定向到 SaveAll 操作(即,将调用该方法)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-09-30
        • 2017-09-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多