Mvc3 - Лучшая практика для работы с данными, которые требуются (почти) для всех запросов? - PullRequest
3 голосов
/ 01 июля 2011

Я создаю приложение в mvc3 и задаюсь вопросом, как обращаться с данными базы данных, которые требуются для всех запросов приложений, некоторые из них зависят от сеанса, некоторые из них зависят от шаблона URL, в основном все данные находятся в базе данных.*

Хотелось бы узнать лучшие практики

Ответы [ 4 ]

3 голосов
/ 10 августа 2011

Лучше всего вообще избегать ViewBag.

См. Этот ответ, в котором подробно описано, как использовать Html.RenderAction() для этой цели:

Лучший способ показать информацию об учетной записи в файле макета в MVC3

3 голосов
/ 05 июля 2011

Я делаю то же самое, что и @rdumont, но с одним исключением: я создаю CommonViewModel, который я использую для определения всех общих свойств, которые я использую.

public class CommonViewModel
{
    public string UserName {get;set;}
    public string Extension {get;set; }
}

Объявите свойство в базовом контроллере:

public abstract class BaseController : Controller
{
    protected CommonViewModel Commons { get; private set; }

    protected virtual void OnResultExecuting(ResultExecutingContext filterContext)
    {
        ViewBag.Commons = Commons;
    }
}

Таким образом я получаю почти все, что напечатано.Единственное, что мне нужно сделать, это привести ViewBag.Commons к CommonViewModel.

3 голосов
/ 01 июля 2011

То, что я делаю в своих приложениях и считаю лучшей практикой, - это загрузка ваших общих данных в ViewBag в конструкторе Controller.

Для каждого проекта у меня есть абстрактный класс DefaultController, который расширяет Controller.Таким образом, каждый контроллер в проекте должен наследоваться от DefaultController, а не Controller.В конструктор этого класса я загружаю все данные, общие для всего проекта, например:

// DefaultController.cs
public abstract class DefaultController : Controller
{
    protected IRepository Repo { get; private set; }

    protected DefaultController(IRepository repo)
    {
        Repo = repo;
        ViewBag.CurrentUser = GetLoggedInUser();
    }

    protected User GetLoggedInUser()
    {
        // your logic for retrieving the data here
    }
}


// HomeController.cs
public class HomeController : DefaultController
{
    public HomeController(IRepository repo) : base(repo)
    {
    }

    // ... your action methods
}

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

0 голосов
/ 05 июля 2011

Я бы предложил использовать базовый класс ViewModel.Таким образом, базовый класс со свойствами / функциями, которые должны быть доступны в любой точке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...