我正在开发一个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目录传递参数。我不想将这个bool变量添加到视图的每个模型
我试图在我的ControllerExtension类中设置TempData目录,但它没有将参数传递给视图
只是想知道,有没有其他方法可以将参数传递给所有视图而不是将其传递给所有控制器的操作?
谢谢
答案 0 :(得分:0)
我做了一些研究,最后找到了适合我需要的以下解决方案,不太确定这是否是最好的方法。
函数SaveWebPagetoPDF(string url,string outputFileName)正在转换传入url的网页,并将转换后的文件保存为pdf文件。
我在SaveWebPagetoPDF函数中添加了一个额外的步骤,以将参数作为查询字符串附加到url。
url = url + "?DisplayMainContentOnly=true";
在我看来,我不是检查TempData,而是检查QueryString:
bool mainOnly= Request.QueryString["DisplayMainContentOnly"] == null? false : Request.QueryString["DisplayMainContentOnly"] == "true";
通过这样做,我不再需要为我的所有控制器操作方法添加参数
[HttpGet]
[Page("View1")]
public virtual ActionResult Index()
{
model1 = new Model();
return this.View(model1);
}