【问题标题】:Passing parameter from controller to view将参数从控制器传递到视图
【发布时间】: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


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-12
    • 1970-01-01
    • 2015-07-29
    • 1970-01-01
    相关资源
    最近更新 更多