从控制器传递参数到视图

Passing parameter from controller to view

我正在处理一个 C# MVC 项目,需要将一些数据从控制器传递到所有视图。

我的任务是将网页保存为 pdf 文件。

总共有 5 个页面,所以有 5 个不同的视图,我还有 5 个控制器,每个视图一个。

我创建了控制器的扩展 class,因此所有控制器都可以使用其中的功能。

因为我需要以不同的方式呈现视图,所以我需要将一个参数传递给每个视图以切换显示(即,如果它用于生成 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 class 中设置 TempData 目录,但它没有将参数传递给视图

只是想知道,有没有其他方法可以将参数传递给所有视图,而不是传递给所有控制器的操作?

感谢

我做了一些研究,最终找到了适合我需要的以下解决方案,不太确定这是否是最好的方法。

函数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);
}