2014-11-24 97 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,你不必在每一个控制器动作中建立选择列表。

相关问题