我有一个部分视图,它在一个名为_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。 “联系我们表格标题”。
这可能吗?
答案 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.