Mvc: Render views to string - how to set culture?

Created on 7 Sep 2017  路  2Comments  路  Source: aspnet/Mvc

Hi,
I am trying to use razor an IViewLocalizer to send localized emails. How do I correctly set the Culture and UiCulture for the current rendering (Core Mvc 1.1.3)?
Thanks a lot!

Code snippet follows:

public class CoreRazorEngineRenderer : IRenderer
{
    private readonly IRazorViewEngine _razorViewEngine;
    private readonly ITempDataProvider _tempDataProvider;
    private readonly IServiceProvider _serviceProvider;

    public CoreRazorEngineRenderer(IRazorViewEngine razorViewEngine, ITempDataProvider tempDataProvider, IServiceProvider serviceProvider)
    {
        _razorViewEngine = razorViewEngine;
        _tempDataProvider = tempDataProvider;
        _serviceProvider = serviceProvider;
    }

    private ActionContext BuildActionContext(string controllerName, string partName)
    {
        var httpContext = new DefaultHttpContext { RequestServices = _serviceProvider };
        var routeData = new RouteData();
        routeData.Values.Add("controller", controllerName);
        routeData.Values.Add("action", partName);
        return new ActionContext(httpContext, routeData, new ActionDescriptor());
    }

    private ViewEngineResult GetView(ActionContext actionContext, string viewName)
    {
        return _razorViewEngine.FindView(actionContext, viewName, true);
    }

    public bool CanRender(string controllerName, string partName, string cultureName)
    {
        return GetView(BuildActionContext(controllerName, partName), partName)?.Success ?? false;
    }

    public async Task<string> Render(string controllerName, string partName, ExpandoObject model, CultureInfo culture, TimeZoneInfo timezone, IWebJobLogger logger)
    {
        var actionContext = BuildActionContext(controllerName, partName);

        var viewResult = GetView(actionContext, partName);
        if (viewResult.View == null || !viewResult.Success)
        {
            throw new ArgumentNullException($"{controllerName}, {partName} does not match any available view");
        }

        using (var sw = new StringWriter())
        {
            var viewDictionary = new ViewDataDictionary(new EmptyModelMetadataProvider(), new ModelStateDictionary())
            {
                Model = model
            };

            var viewContext = new ViewContext(
                actionContext,
                viewResult.View,
                viewDictionary,
                new TempDataDictionary(actionContext.HttpContext, _tempDataProvider),
                sw,
                new HtmlHelperOptions()
            );

            await viewResult.View.RenderAsync(viewContext);
            var result = sw.ToString();

            return result;
        }
    }
}
question

Most helpful comment

You could set CultureInfo.CurrentCulture \ CultureInfo.CurrentUICulture before the RenderAsync call:

```C#
var currentCulture = CultureInfo.CurrentCulture;
var currentUICulture = CultureInfo.CurrentUICulture;
try
{
CultureInfo.CurrentCulture = culture;
CultureInfo.CurrentUICulture = culture;
await viewResult.View.RenderAsync(viewContext);
}
finally
{
CultureInfo.CurrentCulture = currentCulture ;
CultureInfo.CurrentUICulture = currentUICulture ;

}
```

All 2 comments

You could set CultureInfo.CurrentCulture \ CultureInfo.CurrentUICulture before the RenderAsync call:

```C#
var currentCulture = CultureInfo.CurrentCulture;
var currentUICulture = CultureInfo.CurrentUICulture;
try
{
CultureInfo.CurrentCulture = culture;
CultureInfo.CurrentUICulture = culture;
await viewResult.View.RenderAsync(viewContext);
}
finally
{
CultureInfo.CurrentCulture = currentCulture ;
CultureInfo.CurrentUICulture = currentUICulture ;

}
```

Yup, exactly what @pranavkm said.

Was this page helpful?
0 / 5 - 0 ratings