我Äôve一直使用(准确的移动浏览器检测)构建ASP.NET MVC站点输出漂亮的移动友好的模板。斯科特谈到在他的岗位的技术一直非常好。
最近,当我不得不解决类似的问题时,试图呈现出本地化的模板,我到了斯科特从深层次看,AOS的方法,如果我能,Äòtweak??它做我想要的东西,这,看上去就像在Visual Studio:
这让我的网站,为多国语言相同的URL。例如,/首页/指数的URL使用相同的控制器,模型等,但将呼吁为基于当前的UICulture英语和西班牙语的用户有不同的看法。
在这里,AOS如何我做到了。我了斯科特,AOS类和重构他们只是有点让我这个功能扩展,有weren,AOT得到重复的代码位(见{A4})。
首先,我把现有的CustomMobileViewEngine类,并更名为它CustomViewEngine这台发动机将不再仅是移动。除thatm其他没有变化是必要的。public class CustomViewEngine : IViewEngine
{
public IViewEngine BaseViewEngine { get; private set; }
public Func<ControllerContext, bool> IsTheRightDevice { get; private set; }
public string PathToSearch { get; private set; }
public CustomViewEngine(Func<ControllerContext, bool> isTheRightDevice,
string pathToSearch, IViewEngine baseViewEngine)
{
BaseViewEngine = baseViewEngine;
IsTheRightDevice = isTheRightDevice;
PathToSearch = pathToSearch;
}
public ViewEngineResult FindPartialView(ControllerContext context,
string viewName, bool useCache)
{
if (IsTheRightDevice(context))
{
return BaseViewEngine.FindPartialView(context, PathToSearch +
"/" + viewName, useCache);
}
return new ViewEngineResult(new string[] { });
//we found nothing and we pretend we looked nowhere
}
public ViewEngineResult FindView(ControllerContext context,
string viewName, string masterName, bool useCache)
{
if (IsTheRightDevice(context))
{
return BaseViewEngine.FindView(context, PathToSearch +
"/" + viewName, masterName, useCache);
}
return new ViewEngineResult(new string[] { });
//we found nothing and we pretend we looked nowhere
}
public void ReleaseView(ControllerContext controllerContext, IView view)
{
throw new NotImplementedException();
}
}
接下来,我把最通用的AddMobilelt; TGT;扩展方法,它改名AddCustomViewlt; TGT,并把它在其自己的视图助手类。
此外,我重构现有MobileHelpers类调用新的重构AddCustomViewlt; TGT,以防止进一步的重复代码。
最后,我创造了一些AddLanguagelt;在他们自己的LocalizationHelpers类的UICulture检测路由扩展方法; TGT。public static class LocalizationHelpers
{
public static bool UICultureEquals(this ControllerContext c, string stringToFind)
{
var culture = CultureInfo.CurrentUICulture;
var cultureName = culture != null ? culture.Name : string.Empty;
return (cultureName.IndexOf(stringToFind,
StringComparison.OrdinalIgnoreCase) >= 0);
}
public static void AddLanguage<T>(this ViewEngineCollection ves,
string cultureName, string pathToSearch)
where T : IViewEngine, new()
{
ves.AddCustomView<T>(c => c.UICultureEquals(cultureName), pathToSearch);
}
public static void AddLanguage<T>(this ViewEngineCollection ves, string cultureName)
where T : IViewEngine, new()
{
ves.AddCustomView<T>(c => c.UICultureEquals(cultureName), cultureName);
}
}
在项目中使用的本地化的意见登记在Application_Start()方法认为是简单的。ViewEngines.Engines.Clear();
ViewEngines.Engines.AddLanguage<WebFormViewEngine>("es-ES");
ViewEngines.Engines.AddGenericMobile<WebFormViewEngine>();
ViewEngines.Engines.AddCustomView<WebFormViewEngine>(c => c.IsMobileDevice()
&& c.UICultureEquals("es-ES"), "Mobile/es-ES");
ViewEngines.Engines.Add(new WebFormViewEngine());
最后,我的样本项目已在自己的类库,这些类,因为它,星光大道,我希望能够在不久的将来提供此功能作为{A5}包。Äôve
我,包括我的示例项目,以供参考。|皮特Mourfield