【发布时间】:2010-04-30 16:30:37
【问题描述】:
是否可以从控制器“产品”中的“保存”操作到控制器“类别”中的“保存所有”操作进行发布??
并且还传递了一个 FormCollection 作为参数
【问题讨论】:
标签: asp.net-mvc post
是否可以从控制器“产品”中的“保存”操作到控制器“类别”中的“保存所有”操作进行发布??
并且还传递了一个 FormCollection 作为参数
【问题讨论】:
标签: asp.net-mvc post
您可以在您的视图中声明这样的表单,并可以指定您希望的任何控制器或操作。
Html.BeginForm("SaveAll", "Category", FormMethod.Post);
如果你在控制器中,那么你可以使用。
TempData["Model"] = Model;
RedirectToAction("SaveAll", "Category");
【讨论】:
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。
【讨论】:
我要么直接从 Product 控制器的 Save 方法更新存储库中的类别,要么在其自己的方法中重构 Save Categories 功能,然后从两个控制器方法中调用它。
【讨论】:
由于 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() 方法的代码分离到一个专用的业务逻辑层中,而不是放在控制器中。理论上,所有这些功能都应该可以在不同的控制器中使用,或者在可以包含在其他应用程序中的库中使用。
【讨论】:
将以下代码放入您的 Product 控制器中:
return RedirectToAction("SaveAll", "Category")
这里,"SaveAll" 是操作名称,"Category" 是控制器名称。
然后,用户将被重定向到 SaveAll 操作(即,将调用该方法)。
【讨论】: