MVC + приложение для нескольких арендаторов - PullRequest
1 голос
/ 08 февраля 2012

Итак, у меня есть приложение MVC, которое должно изменить заголовок веб-сайта и цвет заголовка в зависимости от домена, из которого оно получено. Итак, у меня есть простая настройка таблицы в SQL как таковая:

DomainName (PK), WebsiteTitle, HeaderColor

Domain1.com, заголовок веб-сайта для домена 1, # ebebeb

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

Спасибо!

Ответы [ 2 ]

1 голос
/ 08 февраля 2012

Есть много способов сделать это.ActionFilters являются односторонними или в BaseController.

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

Если вы решите каждое действие,создайте базу контроллера, наследуя от Controller, затем переопределяя OnActionExecuting.В этом методе вы можете делать вызовы, чтобы получать и добавлять данные в viewdata.Например:

public class BaseController : Controller
{
    protected override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        filterContext.Controller.ViewData.Add("SiteTitle", "Site title");
        base.OnActionExecuting(filterContext);
    }
}

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

public class BaseController : Controller
{
    protected override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        var result = filterContext.Result as ViewResultBase;
        var baseModel = (BaseViewModel) result.ViewData.Model;

        baseModel.SiteTitle = "Site Title";

        base.OnActionExecuted(filterContext);
    }
}

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

0 голосов
/ 08 февраля 2012

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

См. Эту статью для немного сложного (но подробного) обзора выбора мобильных и настольных ПК . Многое из того, что говорит автор, сосредоточено на обнаружении экранного решения и т. Д., Которое непосредственно к вам не относится, но механизм выбора главной страницы или страницы макета должен быть именно тем, что вы ищете.

Или вы можете справиться с этим с помощью наследования.

Реализация базового контроллера, вот так:

public class BaseController : Controller
{
   public string SiteTitle { get { .... } }
   public string HeaderColor { get { ... } }
   /// whatever other "global" properties you need

}

Затем каждый из ваших контроллеров наследуется от BaseController

public class HomeController : BaseController
{
    public ActionResult Index()
    {
        var myTitle = SiteTitle; 
        /// then, do whatever you want with it
        return View();   
    }
}

В средствах доступа к свойствам в BaseController прочитайте заголовок и любые другие необходимые свойства из файла .settings или раздела AppSettings в web.config.

Controller также предоставляет события, которые можно использовать для установки этих свойств, чтобы вам не приходилось дублировать какой-либо код для получения этих значений в каждом представлении.

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