2013-07-26 4 views
1

Я наткнулся на эту ситуацию, когда я установил переменную viewbag внутри контроллера MVC, но не могу ее прочитать на главной странице, переменная viewbag всегда показывает значение null в Masterpage.Как читать переменную viewbag на странице родителя

Я подозреваю, что это связано с тем, что мастер-страница отображается перед вызовом диспетчера страниц, но мне все же нужно как-то обмениваться данными.

+0

Вам может понадобиться ** [ TempData] (http://stackoverflow.com/a/17199709/2015869) **. –

+0

Причина, по которой нельзя использовать 'ViewBag', заключается в том, что когда вы добираетесь до страницы макета, это время перенаправляется с моего запроса на просмотр, что означает второй запрос. –

ответ

1

я 100% согласен с @Chase Florell но ответить вам вопрос прямо, я полагаю, вы можете просто использовать ViewContext.Viewbag

+0

Оказывается, я устанавливал переменную Viewbag.x внутри оператора IF, который никогда не попадал. Перемещение Viewbag.x = true вне IF решило проблему. Нет необходимости использовать ViewContext, потому что Viewbag.x достаточно. – user1615362

+0

В частичных представлениях, я считаю, вы должны использовать Controller.ViewContext.ViewBag («MyBag») – RichC

0

Без дополнительной информации в вашей бизнес-логике я мог бы быть вне базы здесь ... но ... Кажется, что настройка любых данных ViewBag в представлении - это Anti-Pattern.

К тому времени, когда View получает визуализацию, поскольку это часть жизненного цикла страницы, ваш ViewModel должен иметь все необходимое, а View и Masterpage должны просто потреблять данные, а не генерировать их.

Я также являюсь членом FIRM в настройке ВСЕГО, относящегося к ViewModel, а НЕ в ViewBag (это личное предпочтение, но широко распространенное).

Если вы опишете свой конкретный сценарий немного дальше, возможно, я смогу помочь вам придумать лучший образец для подражания.

public class LayoutViewModel 
{ 
  public bool UseFacebookConnect { get; set; } 
} 
public class SomeViewModel : LayoutViewModel 
{ 
  public string SomeData { get; set; } 
} 
public class SomeController : Controller 
{ 

    public ActionResult Index() 
        { 

      var someViewModel = new SomeViewModel  
       { 
        SomeData = "",  
        UseFacebookConnect = true 
       }; 

       return View(someViewModel); 
    } 
+0

У меня есть код FaceBook Connect JavaScript на главной странице, но мне нужно скрыть его на некоторых страницах, которые не нуждаются в социальной функции. – user1615362

+0

Итак, передайте bool в вашем ViewBag. 'ViewBag [" useFacebookConnect "] = false;' из контроллера ... не из представления. Я бы поставил логику в «ActionFilter», чтобы сохранить ваш код [DRY] (http://en.wikipedia.org/wiki/Don't_repeat_yourself). –

Смежные вопросы