2012-07-07 2 views
1

조치 후 현재보기로 해요 돌아. 레이아웃의 일부로 언어/로컬라이제이션 변경에 사용되는 두 개의 링크를 표시하고 싶습니다.나는 MVC.NET 3.</p> <p>나는 <code>_Layout.cshtml</code> 기본으로 (구조, 탐색)를 사용하여 주위에 내 머리를 정리하려고 _Layout.cshtml

어떤 페이지를 보든 표시하고 클릭 할 수 있어야하며 현지화를 변경 한 후이라는보기를 다시로드하고 싶습니다. 따라서 고객이보고있는 페이지가 다시로드되고 새 현지화가 설정됩니다.

한 가지 방법은 각 사이트 컨트롤러에서 지역화 변경 작업을 복사하여 붙여 넣는 것이지만 더 쉽고 세련된 방법은 없습니까?

지역화 변경을 처리하는 특정 컨트롤러를 만들려고했지만 이전 컨트롤러로 뷰어를 반환하는 방법을 알 수 없습니다.

아마도 jquery로이 작업을 쉽게 수행 할 수 있습니까?

언어 변경 버튼이있는 _Layout 파일의 DIV입니다. 현재 컨트롤러의 액션을 호출합니다. 즉, 각 컨트롤러의 컨트롤러에 정의해야합니다. (좋은 점은 반환되는 뷰가 항상 정확하다.)

<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")) 
... 

편집 , 나는 레이아웃 페이지에서 controlleraction 값을 보내

@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 ApplicationsController : BaseController 
{ 
    // 
    // GET: /Applications/ 

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

나는 몇 주 전에 매우 비슷한 문제를 겪었다. 베이스 컨트롤러는 제가 취한 루트였습니다. 모든 종류의 쓰레기에 매우 편리합니다. – ledgeJumper

2

nUrl :

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

내부

당신의 LocalizationAction이 URL로 리디렉션 :

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 class BaseController : Controller 
{ 
    [HttpPost] 
    public ActionResult Index(string localization) 
    { 
     Thread.CurrentThread.CurrentCulture = Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo(localization); 
     return View(); 
    } 
} 

사이트의 Controllers가 만 마음을 그들의 자신의 행동을 그것으로부터 상속과 필요의 각. ToString()); 나는 현지화 변경 얻을 수 없기 때문에

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()); 
    } 
관련 문제