2009-09-16 50 views
1

返回的ActionResult當我有兩個ASP.NET MVC操作:ASP.NET MVC查看問題從不同的動作

public ActionResult GetAll() 
{ 
     return GetOne(1); 
} 

public ActionResult GetOne(Int32 id) 
{ 
     return View(id); 
} 

正如你所看到的,GETALL呼籲行動GetOne。但是,當調用GetAll()時(調用GetOne(id)並且應該返回GetOne視圖),MVC會拋出一個錯誤,指出沒有GetAll視圖。咦?

我如何讓GetAll調用GetOne並使用GetOne的視圖(我認爲這是合乎邏輯的事情發生的開始)?

回答

6
public ActionResult GetOne(Int32 id) 
{ 
     return View(id, "GetOne"); 
} 

指定視圖名稱會明確覆蓋缺省值,即在此情況下使用路由值集合中的操作鍵,該值等於「GetAll」。

+0

@Craig,感謝您的回答! 您認爲在其他操作中調用操作是否正常嗎?在我看來,一項行動應該獨立於另一項行動。這樣他們可以很容易地被測試和使用。 – azamsharp 2009-09-16 20:39:44

+0

重要的是不惜一切代價避免重複代碼。不過,有很多方法可以做到這一點。你可以有兩個調用共享函數的「獨立」動作去獲得一個模型,例如,在這種情況下,似乎很清楚應該使用相同的觀點。因此,視圖必須明確指定,或者可以使用某種類型的共享視圖(如MVC 2默認模板視圖)。換句話說,這取決於你在做什麼。 – 2009-09-16 20:53:35

1

與許多MVC框架一樣,ASP.NET MVC根據約定做出了很多假設。如果你不遵守他們的慣例,你會有更多的工作要做。在這種情況下,慣例是它們是與您的操作名稱相同的視圖,位於與控制器名稱相對應的文件夾中。

如果您的控制器是UsersController,並且您的操作是GetAll,那麼它期望查找Views/Users/GetAll視圖。

如果要返回以不同的操作相對應的視圖,你需要指定(使用默認代替)說:

return View(id, "GetOne") 
+0

但我打電話給行動GetOne(其視圖存在)?唯一的區別是我從另一個動作中調用它。 – Alex 2009-09-17 08:17:48