2012-07-07 2 views
1

Я пытаюсь обернуть мою голову вокруг MVC.NET 3.Возвращаясь к текущему виду после действий в _Layout.cshtml

я использую _Layout.cshtml в качестве основы (структура, навигация). В рамках макета я хочу отобразить две ссылки, используемые для изменения языка/локализации.

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

Один из способов - скопировать и вставить действие, изменяющее локализацию, на каждом из контроллеров сайтов, но нет ли более простого и элегантного способа?

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

Возможно, это проще сделать с помощью jquery?

Это DIV файл _Layout с изменениями языка. Он вызывает действие в текущем контроллере, что означает, что я должен определить его в каждом из контроллеров сайта. (Хорошая вещь мнение, что возвращается всегда правильно.)

<div id="top> 
    @using (Html.BeginForm()) 
    { 
     <button id="sv_flag" name="localization" title="@Resources.Global.Sv_Flag_Hover" value="sv-SE" /> 
     <button id="en_flag" name="localization" title="@Resources.Global.En_Flag_Hover" value="en-GB" /> 
    } 
</div> 

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

@using (Html.BeginForm("LocalizationAction", "LocalizationController")) 
... 

Edit Теперь, используя предложение от Дарина, я посылаю в значениях controller и action со страницы макета:

@using (Html.BeginForm("SetLocalization", "Localization", 
      new { returnController = @ViewContext.Controller.ValueProvider.GetValue("controller").RawValue, 
        returnAction = @ViewContext.Controller.ValueProvider.GetValue("action").RawValue })) 
... 

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

public ActionResult SetLocalization(string localization, string returnController, string returnAction) 
    { 
     Thread.CurrentThread.CurrentCulture = Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo(localization); 
     return RedirectToAction(returnAction, returnController); 
    } 

ответ

1

Я нашел совершенно другое (и намного проще и элегантно) решение моей проблемы.

Я просто создал BaseController, в котором содержится действие для изменения локализации.

Затем все контроллеры, которые я добавляю на сайт, наследуют от этого BaseController. Это дает одно место для кода и не требует отправки каких-либо возвращаемых параметров и т. Д.

BaseController:

public class BaseController : Controller 
{ 
    [HttpPost] 
    public ActionResult Index(string localization) 
    { 
     Thread.CurrentThread.CurrentCulture = Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo(localization); 
     return View(); 
    } 
} 

Каждый из сайта Controllers тогда только нужно наследовать от него, а затем против их собственных действий:

public class ApplicationsController : BaseController 
{ 
    // 
    // GET: /Applications/ 

    public ActionResult Index() 
    { 
     return View(); 
    } 
} 
... 
+0

У меня была очень похожая проблема несколько недель назад. Базовым контроллером был маршрут, который я взял. Очень удобно для всех видов мусора. – ledgeJumper

2

Вы можете пройти ретур nUrl:

@using (Html.BeginForm("LocalizationAction", "LocalizationController", new { returnUrl = Request.Url.AbsoluteUri })) 
{ 
    ...  
} 

и внутри ваш LocalizationAction перенаправлять этот адрес:

public ActionResult LocalizationAction(string returnUrl) 
{ 
    ... do your localization stuff and once you are done get back: 

    return Redirect(returnUrl); 
} 

очевидно, что вы могли бы сделать небольшую проверку, прежде чем слепо перенаправление. Такие вещи, как параметр returnUrl не пуст и принадлежит ли он вашему домену. Вы можете посмотреть, как это делает по умолчанию AccountController, как только он аутентифицирует пользователя.

+0

Спасибо, используя вашу идею сейчас, но обновил свой первоначальный вопрос, так как я не могу получить локализации для изменения. – roqvist

2

возврата перенаправлении (Request.UrlReferrer. Нанизывать());

public ActionResult Change(String LanguageAbbrevation) 
    { 
     if (LanguageAbbrevation != null) 
     { 
      Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(LanguageAbbrevation); 
      Thread.CurrentThread.CurrentUICulture = new CultureInfo(LanguageAbbrevation); 
     } 

     HttpCookie cookie = new HttpCookie("Language"); 
     cookie.Value = LanguageAbbrevation; 
     Response.Cookies.Add(cookie); 

     return Redirect(Request.UrlReferrer.ToString()); 
    } 
Смежные вопросы