Передача параметра из контроллера в представление

Я работаю над проектом С# 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;
}

Контроллер1.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 для передачи параметра. Я не хочу добавлять эту логическую переменную в каждую модель представлений.

Я попытался установить каталог TempData в своем классе ControllerExtension, но он не передает параметр представлениям

Просто интересно, есть ли другой способ передать параметр всем представлениям вместо того, чтобы передавать его действиям всех контроллеров?

Спасибо


person Justin    schedule 07.05.2015    source источник
comment
Есть ли причина, по которой вы не можете разместить DisplayMainContentOnly на своей модели?   -  person David L    schedule 07.05.2015
comment
@DavidL Я могу, но для меня добавление одной и той же переменной bool к 5 моделям кажется накладными расходами. Просто попытайтесь найти способ сделать это только один раз. Я думал добавить глобальную переменную в мой класс ControllerExtension, а затем получить доступ к этой глобальной переменной из каждого представления. Но должно ли представление знать что-нибудь о контроллере?   -  person Justin    schedule 07.05.2015
comment
Нет, не должно. Представление должно знать только о модели, и даже тогда оно не должно делать много вариантов рендеринга на основе модели. Похоже, вам следует подумать о рендеринге различных представлений, которые могут включать или не включать частичные элементы (которые отображают навигацию, ссылки и т. д.) и которые должны выбираться контроллером.   -  person David L    schedule 07.05.2015
comment
Как насчет базового класса для ваших моделей представления, который включает DisplayMainContentOnly? Снизьте ваши другие модели представления от этого.   -  person TheEdge    schedule 07.05.2015


Ответы (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);
}
person Justin    schedule 12.05.2015