【发布时间】:2015-05-07 02:23:59
【问题描述】:
我正在开发一个 C# MVC 项目,需要将一些数据从控制器传递到所有视图。
我的任务是将网页保存为 pdf 文件。
总共有 5 个页面,所以有 5 个不同的视图,我也有 5 个控制器,每个视图一个。
我创建了一个控制器的扩展类,以便所有控制器都可以使用其中的功能。
由于我需要以不同的方式渲染视图,我需要向每个视图传递一个参数来切换显示(即,如果它用于生成 pdf,我只需要视图上的主要内容而不需要菜单和链接,否则显示整个视图。)
这是我的实现:
ControllerExtension.cs
public GenerateAllPagesAsPdf
{
bool DisplayMainContentOnly = True;
SaveWebPagetoPDF(MVC.Controller1.Index(DisplayMainContentOnly ), pdf1)
SaveWebPagetoPDF(MVC.Controller2.Index(DisplayMainContentOnly ), pdf2)
SaveWebPagetoPDF(MVC.Controller3.Index(DisplayMainContentOnly ), pdf3)
SaveWebPagetoPDF(MVC.Controller4.Index(DisplayMainContentOnly ), pdf4)
SaveWebPagetoPDF(MVC.Controller5.Index(DisplayMainContentOnly ), pdf5)
DisplayMainContentOnly = False;
}
Controller1.cs
[HttpGet]
[Page("View1")]
public virtual ActionResult Index(bool DisplayMainContentOnly)
{
TempData["mainOnly"] = DisplayMainContentOnly;
model1 = new Model();
return this.View(model1);
}
View1.cshtml
@{
bool mainOnly= (bool)TempData["mainOnly"];
}
@if (mainOnly) {
<div>
<h2>@Html.Heading()</h2>
@RenderBody()
</div>
} else {
<div>
<h2>@Html.Heading()</h2>
@RenderBody()
</div>
<div id="mc-column-wrapper">
@Html.Action(MVC.Home.Menu())
</div>
}
并且所有其他控制器和视图都具有相同的Controller1和View1实现,使用TempData目录传递参数。我不想将此布尔变量添加到视图的每个模型中
我尝试在我的 ControllerExtension 类中设置 TempData 目录,但它没有将参数传递给视图
只是想知道,有没有其他方法可以将参数传递给所有视图,而不是传递给所有控制器的操作?
谢谢
【问题讨论】:
-
有什么原因不能在模型上放置 DisplayMainContentOnly 吗?
-
@DavidL 我可以,但对我来说,将相同的 bool 变量添加到 5 个模型似乎是一种开销。试着找到一种只做一次的方法。我正在考虑向我的 ControllerExtension 类添加一个全局变量,然后从每个视图中访问这个全局变量。但是视图是否应该知道关于控制器的任何信息?
-
不,不应该。视图应该只知道模型,即使那样,它也不应该基于模型做出很多渲染选项。您似乎应该考虑渲染可能包含或不包含部分(渲染导航、链接等)的不同视图,并且应该由控制器选择。
-
包含 DisplayMainContentOnly 的视图模型的基类怎么样?从中继承您的其他视图模型。
标签: c# asp.net-mvc-4 view controller tempdata