从不同的控制器更新共享视图

时间:2014-04-24 17:07:20

标签: c# asp.net asp.net-mvc-4

我有一个部分视图,它在一个名为_Layout.cshtml的共享布局中呈现。

_Layout.cshtml

<h1>@Html.Action("Home", "TestView");</h1>

控制器:

[ChildActionOnly]
public ActionResult TestView()
{
    var model = new TestViewModel();
    model.Title = "Default Title";
    return PartialView("/Views/Shared/_TestView.cshtml", model);
}

_TestView.cshtml

@model TestMVC.Models.TestViewModel
@Model.Title

到目前为止一切正常,但我想知道是否可以从不同的动作/控制器更新模型。
例如:localhost:8888/home/index,我想显示默认标题“默认标题”,但在某些操作/控制器中localhost:8888/home/contactus
我想要显示不同的标题ex。 “联系我们表格标题”。
这可能吗?

2 个答案:

答案 0 :(得分:2)

只需添加一个可选参数:

[ChildActionOnly]
public ActionResult TestView(string title = "Default Title")
{
    var model = new TestViewModel{ Title = title };
    return PartialView("/Views/Shared/_TestView.cshtml", model);
}

然后调用它

<h1>@Html.Action("Home", "TestView", new { title = "Custom Title" })</h1>

<h1>@Html.Action("Home", "TestView")</h1> //use default title

答案 1 :(得分:1)

由于您的部分视图位于<h1>标记之间,这是否意味着它只会用作文本的占位符?

无论哪种方式,我都觉得有比使用部分页面更好的解决方案。

您只需使用ViewBag设置所选字段,例如ViewBag.CustomHeader = "Hello";

然后您可以删除局部视图并引用该字段:

<h1>@ViewBag.CustomHeader</h1>

请记住,您每次都要负责设置该值,或者让_Layout页面提供默认值,以防您未设置该值。

<h1>@(ViewBag.CustomHeader ?? "No title was set!")</h1>

使用Razor的部分设置标题可以实现第二个选项。如果您愿意,这将允许输入HTML。

将您的<h1>(包括代码)更改为:

@RenderSection("CustomHeader", required : false);
//you can set required to true if you need it.

然后,在您呈现的任何视图上,您​​可以按该名称添加一个部分,它将添加到_Layout页面而不是包含的视图。

@section CustomHeader {
    <h1>Hello, again! I'm another page!</h1>

    <!-- You can add anything you want here -->
}

有关章节的更多信息,请参见here.