Модераторы: gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ASP.NET MVC 3 - ссылки в частичном представлении 
:(
    Опции темы
korob2001
Дата 20.5.2015, 13:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

Репутация: нет
Всего: 61



Всем привет!

Столкнулся с такой проблемой. На сайте нужно сделать меню переключения с одного языка на другой. Сделал частичное представление:
Код

<ul id="lang-menu">
    <li>
        <div style="background-image: url(/Content/icons/flags/@{@Model.CurrentLanguage.Code}.png)">@Model.CurrentLanguage.Name</div>
        <ul>
            @foreach (ERider.Domain.Entities.Language lang in Model.Languages)
            {
                <li>@Html.ActionLink(lang.Name, null, null, new { lang = lang.Code }, new { style="background-image: url(/Content/icons/flags/" + lang.Code + ".png)" })</li>
            }
        </ul>
    </li>
</ul>

Подключаю его в мастер странице:
Код

@Html.Action("LangMenu", "Master")

Меню выводится, но ссылки указывают на контроллер Master и его действие LangMenu. Вот код этого действия:
Код

[ChildActionOnly]
public ActionResult LangMenu(string controller, string action, string lang)
{
     Language current = langRepository.GetLanguageByCode(lang);
     LangMenuViewModel model = new LangMenuViewModel()
     {
          CurrentLanguage = current,
          DefaultLanguage = langRepository.DefaultLanguage,
          Languages = langRepository.Languages.Where(p => !p.Code.Equals(current.Code)),
          ControllerName = controller,
          ActionName = action
      };
     return View(model);
}

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

Заранее благодарен за любую информацию.


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
Cheloveck
Дата 20.5.2015, 17:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1578
Регистрация: 26.7.2008
Где: Тула

Репутация: 1
Всего: 32



Укажи в параметрах имя контроллера и экшена вместо null.

Код

@Html.ActionLink(lang.Name, "ACTION_NAME", "CONTROLLER_NAME", new { lang = lang.Code }, new { style="background-image: url(/Content/icons/flags/" + lang.Code + ".png)" })


Добавлено через 2 минуты и 54 секунды
https://msdn.microsoft.com/en-us/library/dd...=vs.118%29.aspx


--------------------
user posted image
PM Jabber   Вверх
korob2001
Дата 20.5.2015, 20:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

Репутация: нет
Всего: 61



Меню расположено в мастер странице, т.е. язык можно выбрать с любой страницы. Думаю не логично будет перебрасывать пользователя на главную, либо какую-то другую страницу, если он просто решил поменять язык.
Мне нужно как-то определить текущий контроллер и действие, если я указываю null, то определяется контроллер и действие частичного представления. [ChildActionOnly].

Например пользователь зашёл на главную страницу сайта:
Код

/Home/Index


Меню для выбора языка должны содержать такие ссылки:
Код

/En/Home/Index
/Fr/Home/Index
/De/Home/Index
/Ru/Home/Index


Если он например зашёл на страницу:
Код

/Product/List


Меню выбора языка должно содержать такие ссылки:
Код

/En/Product/List
/Fr/Product/List
/De/Product/List
/Ru/Product/List

Думаю понятно, что жёстко вписать имя контроллера и действия не получится, так как в каждом View ссылки будут меняться. Мне нужно как-то передать по цепочке View -> MasterPage -> PartialView  текущий контроллер и действие.


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
Cheloveck
Дата 20.5.2015, 20:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1578
Регистрация: 26.7.2008
Где: Тула

Репутация: 1
Всего: 32



Вообще, с такими линками тяжело будет жить. На каждый чих кастомные решения придётся писать. Я бы посоветовал передавать язык в query string
Код

/Product/List?lang=de


Хотя, если такой вот раут как следует замапить, то получится то, что надо

Код

routes.MapRouteWithPageName(
    "product-list",
    null,
    "{lang}/{controller}/{action}",
     new { controller = "Product", action = "List", lang = UrlParameter.Optional }
 );


Не уверен, что это заработает, негде проверить.

Это сообщение отредактировал(а) Cheloveck - 20.5.2015, 20:29


--------------------
user posted image
PM Jabber   Вверх
korob2001
Дата 21.5.2015, 11:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

Репутация: нет
Всего: 61



Ну с роутами вроде проблем нет. Не могу сгенерировать правильную ссылку. Насколько я понимаю, мне нужно каким-то образом передать из мастер страницы, имя текущего контроллера и экшена, в метод:
Код

[ChildActionOnly] 
public ActionResult LangMenu(string controller, string action, string lang) 

     Language current = langRepository.GetLanguageByCode(lang); 
     LangMenuViewModel model = new LangMenuViewModel() 
     { 
          CurrentLanguage = current, 
          DefaultLanguage = langRepository.DefaultLanguage, 
          Languages = langRepository.Languages.Where(p => !p.Code.Equals(current.Code)), 
          ControllerName = controller, 
          ActionName = action 
      }; 
     return View(model); 


Т.е. вызов дочернего представления, в мастер странице, должен выглядеть как-то так:
Код

@Html.Action("LangMenu", "Master", Url.GetController(), Url.GetAction());



--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
Cheloveck
Дата 21.5.2015, 11:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1578
Регистрация: 26.7.2008
Где: Тула

Репутация: 1
Всего: 32



Код

string controllerName = ViewContext.RouteData.GetRequiredString("controller");
string actionName = ViewContext.RouteData.GetRequiredString("action");



--------------------
user posted image
PM Jabber   Вверх
korob2001
Дата 21.5.2015, 11:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

Репутация: нет
Всего: 61



Да и сигнатура метода должна измениться на примерно такую:
Код

[ChildActionOnly]  
public ActionResult LangMenu(string controller, string action, string parrentController, string parrentAction) {



--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
Cheloveck
Дата 21.5.2015, 11:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1578
Регистрация: 26.7.2008
Где: Тула

Репутация: 1
Всего: 32



Я бы просто добавил во все экшн-методы параметр lang и таскал бы его по всем вьюхам. Тогда все экшены будут примерно такого вида

Код

ActionResult Details(Guid id, string lang) {
    var model = entityFacade.GetModelForLang(id, lang); // Здесь будут дёргаться локализованные данные
    return View(model); 
}


Добавлено через 1 минуту и 13 секунд
Соответсвенно из меню будет зваться тот же экшн-метод, что отрендерил текущую вьюху, только с другим lang. А потом запихнёшь этот lang во все линки и формы.


--------------------
user posted image
PM Jabber   Вверх
korob2001
Дата 21.5.2015, 14:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

Репутация: нет
Всего: 61



Цитата

Я бы просто добавил во все экшн-методы параметр lang и таскал бы его по всем вьюхам. Тогда все экшены будут примерно такого вида

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

Добавил 2 строки в начале метода:
Код

[ChildActionOnly]
        public ActionResult LangMenu(string controller, string action, string lang)
        {
            if (controller == "Master") controller = "";
            if (action == "LangMenu") action = "";
            
            Language current = langRepository.GetLanguageByCode(lang);
            LangMenuViewModel model = new LangMenuViewModel()
            {
                CurrentLanguage = current,
                DefaultLanguage = langRepository.DefaultLanguage,
                Languages = langRepository.Languages.Where(p => !p.Code.Equals(current.Code)),
                ControllerName = controller,
                ActionName = action
            };
            return View(model);
        }

и всё заработало.  smile 

Cheloveck ОГРОМНОЕ СПАСИБО ЗА ПОМОЩЬ


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
Любитель
Mymik
mr.DUDA

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Любитель, Mymik, mr.DUDA.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Разработка под ASP.NET | Следующая тема »


 




[ Время генерации скрипта: 0.1495 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.