2014-11-24 95 views
0

我有一個_Layout.cshtml文件作爲每個主視圖上的標題部分視圖。MVC 4 - 通過ViewBag傳遞數據到_Layout局部視圖

我想在_Layout上定義一個Select元素,並使用ViewBag將一些數據傳遞給局部視圖,以便數據填充到視圖中,並且稍後可以提交。

我的問題是:

  • 哪裏的ActionResult函數定義爲包含在ViewBag定義數據?
  • 如果我想在部分視圖上提交表單,該怎麼辦?何處以及哪些行爲應該被定義/用於接受HttpPost命令?

謝謝!

+0

'ViewBag'是'ControllerBase'的一個屬性,所以它在所有控制器方法中都可用。您可以發佈到任何控制器中的任何方法。 – 2014-11-24 05:56:49

+0

但是應該定義將數據設置爲ViewBag的ActionResult的位置?對於_Layout視圖,沒有Index ActionResult ... – alextc 2014-11-24 06:00:14

+0

如果您的佈局文件有例如'

@ViewBag.SomeProperty
',並且在返回使用該佈局的視圖的操作方法中,如果添加了'ViewBag.SomeProperty =「某個值」 ',然後在視圖 – 2014-11-24 06:07:04

回答

3

我建議做一個基礎控制器類。 繼承它的所有控制器。 爲佈局渲染數據的代碼可以位於其構造函數中,也可以位於您的所有控制器可以用作此基類的子項的其他常用函數中。

public class BaseController : System.Web.Mvc.Controller 
{ 
    public BaseController() 
    { 
    // This code will run for all your controllers 
    ViewBag.MyData = "SomeData"; 
    } 
} 

關於你的問題:

我該怎麼辦,如果我希望提交的局部視圖形式?何處以及哪些行爲應該被定義/用於接受HttpPost命令?

你可以把控制器名稱的形式:

@using (Html.BeginForm("ActionName", "Controller")) 
+0

中會顯示優秀的「某些值」。謝謝! – jonatanes 2017-02-18 19:54:02

1

大約有_layout.cshmtl和部分意見是如何工作的可能幾個誤區:

  • _layout.cshtml不是局部視圖。這是所有頁面使用的佈局模板。它有點像頁面的「外部」。它會自動應用(除非您設置了Layout = null)。部分視圖依次是頁面的「內部」。您可以使用@Html.Partial從您的頁面明確地調用它。

  • 即使您的頁面由多個視圖呈現 - 實際視圖,佈局,也許是部分視圖 - 它仍然是單個控制器操作的結果。 (除非您使用@Html.Action來渲染部分「動作」)。此外,呈現的頁面是單個HTML頁面,也就是說,頁面上的任何表單都只是HTML表單。

因此,回答「哪裏是定義的ActionResult的功能」:在您希望呈現爲頁面的操作*

的回答「哪個動作應該被用來接受HttpPost命令「與表單在您的頁面上相同:您可以在任意控制器上定義任意操作來接收表單。你只需要在渲染的形式來指代行動:

@using (Html.BeginForm("action", "controller")) { ... } 

*)如果你想防止不必建立在每個選擇列表和依賴_layout每個控制器的動作,你可以可以想象使用@Html.Action。也就是說,您可以定義一個「部分動作」,它只是一個控制器動作,它返回一個PartialView()和一個局部視圖來渲染該動作中的模型。然後,您可以使用該部分操作來構建選擇列表。

然而,在閱讀了關於ASP.NET vNext的一些新聞後,部分行爲似乎不被社區所喜歡,而在vNext中將會有另一種方法來實現。

不過如果你想要走這條路這使您能夠將邏輯的下拉菜單(語言用戶菜單?)從您的其他行動和觀點分開:

class UserController 
{ 
    PartialViewResult UserMenuDropdown() 
    { 
     return PartialView(BuildUserMenuFrom(.....)); 
    } 

    [Post] 
    ActionResult PostUserMenu() 
    { 
     // do whatever you want once the form is posted 
    } 
} 

在你_layout調用部分動作:

@Html.Partial("UserMenuDropdown", "User") 

而且在UserMenuDropdown視圖渲染形式:

@using (Html.BeginForm("PostUserMenu")) 
{ 
    @Html.DropDownListFor(m => m.UserMenuSelectList) 
} 

這樣,您的下拉列表就成爲「頭等成員」,擁有自己的控制器操作,主視圖和模型。你不需要一個ViewBag,你不必在每一個控制器動作中建立選擇列表。

相關問題