Как получить доступ к ViewBag.Title после того, как он был установлен базовым представлением? - PullRequest
4 голосов
/ 02 июня 2011

Вот в чем дело.У меня есть действие MVC, и к этому действию я применил пользовательский атрибут ActionFilterAttribute, чтобы заставить десериализацию работать.Теперь, что я хочу сделать, это установить некоторый заголовок на основе ViewBag.Title, который установлен внутри этого представления.

Я попытался обернуть ViewResult своим собственным и переопределить ExecuteResult, но ViewBagвсегда пусто: - (.

Это вообще возможно или двигатель MVC сбрасывает ViewBag после выполнения _layout?

Обновление: Позвольте мне опубликовать несколько примеров кода, чтобы прояснить, что я хочу сделать. У меня есть служба электронной почты, где я отображаю тело из представления MVC. Таким образом, мое представление выглядит так:

@{ViewBag.Title = "EventCreated";}

Something that ressembles an email message here.

Теперь у меня есть контроллер сдействие, которое выглядит примерно так:

 public ActionResult HelloWorld(MailView<HelloWorldMessage> msg)
        {
            Response.Headers["subject"] = "Test subject";

            return View(msg);
        }

Я хочу сделать так, чтобы оператор Headers ["subject"] выглядел как Response.Headers ["subject"] = ViewBag.Title; и я хочу, чтобымогу позволить представлению думать, что оно обрабатывает обычную веб-страницу.

Я пытался использовать ActionFilterAttribute и переопределить OnResultExecuted, но не смог заставить его работать.

Один из возможных вариантов - установитьэто на странице макетаи на самом деле решить на основе определенных критериев, какой макет использовать.Таким образом, я все еще могу скрывать Reponse от своих взглядов, но сделать его довольно чистым.Что вы думаете?

Спасибо, Анже

1 Ответ

3 голосов
/ 03 июня 2011

Попробуйте это - назначьте вывод результата просмотра

var output = View(msg);
//do your other viewbag stuff here
return output;

Зачем все это - я не следил, когда вы сказали "и я хочу, чтобы у View была возможность работать с обычной веб-страницей."

Редактировать : Почему бы вам тогда просто не установить это с помощью вспомогательного метода в вашем View? ала

@{
   SetTitle("Home Page");
}


и

@functions {
    public void SetTitle(string title)
    {
        ViewBag.Title = title;
        Response.Headers.Add("title", title);
    }

}

...