Прочитать параметр из маршрута в ViewBag для всех представлений в одном месте - PullRequest
3 голосов
/ 27 января 2012

У меня есть работающий проект MVC3, и мне нужно добавить string languageId в качестве первого параметра маршрута, например:

routes.MapRoute(
    "ProductRoute",
    "{languageId}/products/{slug}", 
    new { controller = "Home", action = "Product"} 
);

languageId необходим только для рендеринга видов, поэтомуЯ хотел бы избежать добавления его в качестве именованного аргумента ко всем моим действиям.В идеале я должен иметь возможность добавить его один раз в viewbag, использовать его во всех зависимых представлениях (все представления имеют одну и ту же главную страницу).

Я мог бы переопределить Initialize в контроллере, прочитать параметр маршрута и сохранить его, но тогда мне нужно будет вводить его в представление при каждом действии, или есть какой-то другой способ?

Ответы [ 3 ]

2 голосов
/ 27 января 2012

Я предполагаю, что это для интернационализации вашего проекта?

Вот хороший пост в блоге (из двух частей), который помог мне с одним из проектов, над которым я сейчас работаю: http://afana.me/post/aspnet-mvc-internationalization.aspx

И еще один отличный пост от Дарин Димитров , который должен ответить на ваш вопрос: ASP.NET MVC ссылка для изменения языка

0 голосов
/ 28 января 2012

Спасибо за ваши ответы.Я закончил тем, что сделал следующее:

Я создал BaseController, который наследуют и переопределили все другие контроллеры, это Initialize method, вот так:

    protected override void Initialize(System.Web.Routing.RequestContext requestContext)
    {
        base.Initialize(requestContext);
        ViewBag.LanguageId = requestContext.RouteData.Values["languageId"] ?? NamedConsts.DefaultLangId;
    }

NamedConsts это просто мой класскоторый содержит статические данные приложения, как язык по умолчанию.Теперь я могу использовать ViewBag.LanguageId в любом месте вниз по течению.Единственная проблема заключается в том, что ViewBag является динамическим, и поэтому я должен приводить ViewBag.LanguageId к string везде.Если у кого-то есть лучшее решение, соответствующее требованиям, я буду рад его принять.

0 голосов
/ 27 января 2012

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

В global.asax:

public MvcApplication()  // Constructor
{
    this.BeginRequest += new EventHandler(MvcApplication_BeginRequest);
}

void MvcApplication_BeginRequest(object sender, EventArgs e)
{
    Context.Items["LanguageId"] = 2;  // Store your language ID value here.
}

В (в моем случае Razor) представлении:

@if ((int)HttpContext.Current.Items["LanguageId"] == 2)
{
    // Do something with the language ID.
}

Или получите доступ к HttpContext.Items ["LanguageId"] в контроллере (или классе ControllerBase) и сохраните элемент в ViewBag.

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