是可以做一個後從控制器「產品」中的操作「保存」到控制器中的操作「SaveAll」類別」??ASP.Net MVC - 從一個控制器到另一個控制器(採取行動)
而且還傳遞的FormCollection作爲參數
是可以做一個後從控制器「產品」中的操作「保存」到控制器中的操作「SaveAll」類別」??ASP.Net MVC - 從一個控制器到另一個控制器(採取行動)
而且還傳遞的FormCollection作爲參數
你可以聲明這樣一種形式,你查看並可以指定你希望的任何控制器或動作。
Html.BeginForm("SaveAll", "Category", FormMethod.Post);
如果你在一個控制器,那麼你可以使用。
TempData["Model"] = Model;
RedirectToAction("SaveAll", "Category");
由於POST
是一個HTTP請求的動詞,這纔有意義(如書面)如果.Save()
方法發起HTTP環回連接到適當的.SaveAll()
,(像http://..../Category/SaveAll
)途徑,並傳遞的形式集合作爲部分請求。這是愚蠢的,不推薦,因爲這將打破你的能力,單元測試這個控制器。
但是,如果你的意思是你要調用.SaveAll()
並返回渲染結果返回給客戶端,你可以使用.RenderAction()
,並通過由.Save()
收到的參數模型或形式收集。
或者,在服務器端,實例化類別控制器並調用其.SaveAll()方法,再次將.Save()
收到的模型作爲參數傳遞。
public ActionResult Save(MyModel m)
{
Category cat = new Category();
return cat.SaveAll(m);
}
但是,你必須採取從調用的結果,並確保它是由結果視圖妥善處理。
如果這是您要做的事情,值得注意的是,您應該確實將.SaveAll()
方法的代碼分解爲專用的業務邏輯層,而不是生活在控制器中。理論上,所有這些功能應該可用於不同的控制器,或者可以包含在其他應用程序中的庫中。
同意,BLL是這個地方。 – 2010-04-30 17:14:07
如果你正在對你的控制器進行單元測試,那麼你的控制器做得太多了。 – 2016-04-06 18:14:00
我要麼直接從產品控制器的Save方法更新存儲庫中的類別,要麼在自己的方法中重構保存類別功能,並從兩種控制器方法中調用該功能。
存儲庫不是我的目標...對不起 – AndreMiranda 2010-04-30 16:52:27
+1表示「重構」,爲此我花了整段時間。 – 2010-04-30 17:39:08
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。
返回RedirectToAction(「ViewService」,「管理」)
這裏,「ViewService」是動作名稱和「管理」是控制器名稱
我覺得什麼op是試圖做的是更新了產品視圖中的類別,他希望保持乾燥。 – 2010-04-30 16:39:41
不是這個......我需要,如果我已經在一個行動中,並在其他控制器的另一個行動... – AndreMiranda 2010-04-30 16:40:30
@AndreMiranda,好,但是不是保存您的類別的最終目標?你是否在意這種情況,只要發生,採用最佳實踐?你想達到什麼目的?如果你只需要調用另一個控制器方法,那麼可以很容易地完成,而不需要創建一個POST請求來完成它。 – 2010-04-30 16:42:13