ASP.Net MVC - 从一个控制器向另一个控制器提交(post)数据 (从一个动作到另一个动作)

13

在控制器 "Product" 的操作 "Save" 中向控制器 "Category" 的操作 "SaveAll" 发送一个post请求是否可行?同时将FormCollection作为参数传递。

5个回答

8
您可以在视图中声明一个表单,可以指定任何您想要的控制器或操作。
Html.BeginForm("SaveAll", "Category", FormMethod.Post);

如果您正在控制器中,则可以使用以下方法。
TempData["Model"] = Model;
RedirectToAction("SaveAll", "Category");

1
如果我已经在一个操作内部,并且想要向其他控制器中的另一个操作发帖,该怎么办? - André Miranda
1
@AndreMiranda,好的,但最终目标不是保存您的类别吗?只要使用最佳实践实现即可,您关心它如何发生吗?您想要实现什么?如果您只需要调用另一个控制器方法,那么可以很容易地完成,而无需创建POST请求来执行它。 - Robert Harvey
抱歉,但我确实需要从一个操作中进行POST到另一个操作... 我只是用“产品”和“类别”来说明我的问题。但是,我的真正问题是关于POST。 - André Miranda
1
@AndreMiranda: 你可以使用TempData传递你的模型。 - Amitabh
1
TempData - 我之前不知道这个。绝对是一个很好的东西可以使用。非常好的答案 +1 - Piotr Kula
显示剩余3条评论

6
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操作。

5

我建议你可以直接在产品控制器的Save方法中更新存储库中的分类,或者将保存分类的功能重构为自己的方法,并从两个控制器方法中调用该方法。


仓库不是我的目标...抱歉。 - André Miranda
+1 如果你说“重构”,我会为此花费整整一段时间。 - 3Dave

2
由于POST是HTTP请求的动词,因此只有在.Save()方法启动HTTP回环连接到适当的.SaveAll()(例如http://..../Category/SaveAll)路由并将表单集合作为请求的一部分传递时,这才有意义(如所写)。 这很傻,并且不推荐,因为这会破坏您对此控制器进行单元测试的能力。
但是,如果您的意思是要调用.SaveAll()并将其呈现的结果返回给客户端,则可以使用.RenderAction(),并将接收到的模型或表单集合作为参数传递给.Save()
或者,在服务器端,只需实例化Category控制器并调用其.SaveAll()方法,再次将通过.Save()接收的模型作为参数传递。
public ActionResult Save(MyModel m)
{
    Category cat = new Category();

    return cat.SaveAll(m);
}

然而,您需要从该调用中获取结果并确保由生成的视图正确处理它。
如果这是您想要做的事情,值得注意的是,您应该将执行保存的.SaveAll()方法的代码分离到专门的业务逻辑层中,而不是放在控制器中。理论上,所有这些功能都应该可用于不同的控制器或库中,可以包含在其他应用程序中。

同意,BLL 是这个的合适位置。 - Robert Harvey
如果你要对控制器进行单元测试,那么你的控制器可能做得太多了。 - Serj Sagan

1

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

return RedirectToAction("SaveAll", "Category")

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接