Сохранять данные между различными контроллерами с базовой страницы - PullRequest
2 голосов
/ 04 октября 2011

Я не уверен, что задаю правильный вопрос здесь.

У меня есть общая страница (главная страница), которая вызывает несколько частичных страниц для бокового меню, верхнего колонтитула, нижнего колонтитула и т. Д., И все мои контроллеры наследуют BaseController.

Теперь, в зависимости от статуса входа пользователя, мне нужно показать разные данные на всех этих неполных страницах, и я подумал, где лучше всего проверить, вошел ли пользователь в систему или нет - BaseController.

И в этом заключается моя проблема. Мне нужно связаться с одним из моих веб-сервисов, чтобы проверить, вошел ли пользователь в систему, и получить соответствующие данные, если он есть. Мне нужно сделать это только один раз, и, поскольку все контроллеры наследуются от BaseController, каждый из этих частичных вызовов страницы приводит к вызову веб-службы.

Очевидно, что я не могу просто вставить приватную переменную bool isUserAuthenticated и проверить флаг, так как у каждого контроллера будет новый экземпляр базового контроллера.

В традиционных проектах asp.net я поместил бы этот материал в HttpContext.Current.Items[] и использовал бы его повторно, но я не могу (каким-то образом) получить доступ к нему в MVC.

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

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

Как люди это делают? спасибо, извините, я новичок в MVC!

Ответы [ 2 ]

3 голосов
/ 20 марта 2012

Вы все еще можете использовать HttpContext.Items, но вам нужно получить к нему доступ через экземпляр HttpContextBase.

Для обратной совместимости вы можете обернуть HttpContext в HttpContextWrapper, например,

var context = new HttpContextWrapper(HttpContext.Current);

@ 1011 * ответ iamserious выше предлагает использовать статическое свойство - с которым я категорически не согласен с .Установка статической переменной относится ко всем приложениям и будет означать, что каждый пользователь будет использовать одну и ту же переменную - , поэтому у всех будут одинаковые данные для входа .Вы хотите сохранить его для каждого пользователя в Session или для Request через HttpContext.Items.


Я бы предложил сделать что-то, используя этот подход, тогда независимо от того, где вы вызываете ContextStash.GetInstance, вы получите один и тот же экземпляр для времени жизни того же запроса ,Вы также можете следовать той же схеме и использовать HttpContext.Session вместо HttpContext.Items:

// could use this.HttpContext inside a controller, 
// or this.Context inside a view, 
// or simply HttpContext.Current
var stash = ContextStash.GetInstance(this.HttpContext);

if(!stash.IsSomething)
{
    // do something to populate stash.IsSomething
}

// class
public class ContextStash
{
    const string cacheKey = "ContextStash";

    public ContextStash(HttpContextBase context)
    {
        // do something with context
    }

    // your shared properties
    public bool IsSomething { get; set; }
    public string Foo { get; set; }
    public int Bar { get; set; }

    // instance methods
    public static ContextStash GetInstance()
    {
        return GetInstance(new HttpContextWrapper(HttpContext.Current));
    }

    public static ContextStash GetInstance(HttpContext context)
    {
        return GetInstance(new HttpContextWrapper( context ));
    }

    public static ContextStash GetInstance(HttpContextBase context)
    {
        ContextStash instance = context.Items[cacheKey] as ContextStash;
        if(null == instance)
        {
            context.Items[cacheKey] = instance = new ContextStash(context);
        }
        return instance;
    }
}
0 голосов
/ 04 октября 2011

хорошо, если вы просто хотите использовать одну переменную в нескольких экземплярах BaseController, используйте ключевое слово static , например:

public class BaseController : Controller
{
    private static bool isUserAuthenticated;
}

Теперь, независимо от того, сколько у вас экземпляров BaseController, все они будут использовать одну переменную isUserAuthenticated, вы меняете значение в одной, вы меняете ее во всех.

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

...