我相信,有許多方法來實現這一點,但你可以遵循下面這一個。
首先,你可以假設一些命名約定的意見,加入文化後綴以他們的名字即ViewName_ 的en-US .cshtml,ViewName_ PL-PL .cshtml等
如果是這樣,根據當前的文化,不要在每個操作中分別構建這些名稱。只要寫常見的邏輯這需要的是關懷 - 基本控制器與被覆蓋的OnActionExecuted
方法:
public class BaseController : Controller
{
protected override void OnActionExecuted(ActionExecutedContext filterContext)
{
base.OnActionExecuted(filterContext);
var view = filterContext.Result as ViewResultBase;
if(view != null)
{
var viewName = string.IsNullOrEmpty(view.ViewName)
? filterContext.RouteData.Values["action"].ToString()
: view.ViewName; // retrieve the custom view name if provided or default action name otherwise
var cultureName = Thread.CurrentThread.CurrentUICulture.Name;
var localizedViewName = string.Format("{0}_{1}", viewName, cultureName); // construct composite, culture-aware name
if (ViewExists(localizedViewName)) // safety check in case not all your views are localized - if so, just return the default name
{
filterContext.Result = new ViewResult { ViewName = localizedViewName };
}
}
}
private bool ViewExists(string name)
{
var result = ViewEngines.Engines.FindView(ControllerContext, name, null);
return result.View != null;
}
}
操作不需要任何本地化現在處理:
public class HomeController : BaseController
{
public ActionResult AboutUs()
{
// (...) nothing special here
return View();
}
}