2010-04-30 136 views

回答

8

你可以聲明這樣一種形式,你查看並可以指定你希望的任何控制器或動作。

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

如果你在一個控制器,那麼你可以使用。

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

我覺得什麼op是試圖做的是更新了產品視圖中的類別,他希望保持乾燥。 – 2010-04-30 16:39:41

+1

不是這個......我需要,如果我已經在一個行動中,並在其他控制器的另一個行動... – AndreMiranda 2010-04-30 16:40:30

+1

@AndreMiranda,好,但是不是保存您的類別的最終目標?你是否在意這種情況,只要發生,採用最佳實踐?你想達到什麼目的?如果你只需要調用另一個控制器方法,那麼可以很容易地完成,而不需要創建一個POST請求來完成它。 – 2010-04-30 16:42:13

2

由於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()方法的代碼分解爲專用的業務邏輯層,而不是生活在控制器中。理論上,所有這些功能應該可用於不同的控制器,或者可以包含在其他應用程序中的庫中。

+0

同意,BLL是這個地方。 – 2010-04-30 17:14:07

+0

如果你正在對你的控制器進行單元測試,那麼你的控制器做得太多了。 – 2016-04-06 18:14:00

5

我要麼直接從產品控制器的Save方法更新存儲庫中的類別,要麼在自己的方法中重構保存類別功能,並從兩種控制器方法中調用該功能。

+0

存儲庫不是我的目標...對不起 – AndreMiranda 2010-04-30 16:52:27

+0

+1表示「重構」,爲此我花了整段時間。 – 2010-04-30 17:39:08

5
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。

0

返回RedirectToAction(「ViewService」,「管理」)

這裏,「ViewService」是動作名稱和「管理」是控制器名稱

相關問題