2017-02-01 115 views
1

我正尝试将全球化添加到Intranet应用程序中,使用Cookie来允许用户使用文化偏好。中间件已建立并运行,但我遇到了基于UI选择附加到cookie的问题。如何Response.Cookies.Append()在ASP.Net核心1.1?

的方法是直接从Asp.Net核心文档如下:

public void ConfigureServices(IServiceCollection services) 
{ 
    services.Configure<RequestLocalizationOptions>(
     options => 
     { 
      var supportedCultures = new List<CultureInfo> 
      { 
      new CultureInfo("en-US"), 
      new CultureInfo("en-GB"), 
      new CultureInfo("fr-FR"), 
      new CultureInfo("es-ES") 
      }; 

      options.DefaultRequestCulture = new RequestCulture(culture: "en-GB", uiCulture: "en-GB"); 
      options.SupportedCultures = supportedCultures; 
      options.SupportedUICultures = supportedCultures; 
     }); 

    services.AddLocalization(); 
    services.AddMvc(config => 
    { 
     var policy = new AuthorizationPolicyBuilder() 
         .RequireAuthenticatedUser() 
         .Build(); 
     config.Filters.Add(new AuthorizeFilter(policy)); 
    }) 
    .AddViewLocalization(); 

    services.AddSession(options => { 
     options.CookieName = "Intranet"; 
    }); 
} 

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) 
{ 
    var locOptions = app.ApplicationServices.GetService<IOptions<RequestLocalizationOptions>>(); 
    app.UseRequestLocalization(locOptions.Value); 

    app.UseSession(); 
    app.UseMvc(routes => 
    { 
     routes.MapRoute(
      name: "default", 
      template: "{controller=Home}/{action=Index}/{id?}"); 
    }); 
} 

[HttpPost] 
public IActionResult SetLanguage(string culture, string returnUrl) 
    { 
    Response.Cookies.Append(
     CookieRequestCultureProvider.DefaultCookieName, 
     CookieRequestCultureProvider.MakeCookieValue(new RequestCulture(culture)), 
     new CookieOptions { Expires = DateTimeOffset.UtcNow.AddYears(1) 
    }); 

    return LocalRedirect(returnUrl); 
} 

的问题是:

  1. 响应不存在
  2. LocalRedirect不存在

我试过了:

  1. 的HttpResponse,HttpRequest的
  2. LocalRedirectResult
+0

你有内部的代码一个控制器还是独立于其他地方? – DavidG

+0

[Cookies和ASP.NET Core]可能的重复(https://stackoverflow.com/questions/36166075/cookies-and-asp-net-core) –

回答

3

从哪里得到该样本的文档,你可以看到,代码来自GitHub有很多样本项目。这个特殊的样品来自Localization.StarterWeb

你的两个“失踪”的方法其实都是ControllerBase部分(这是从Controller继承。所以,如果你把这个动作方法到控制器,它会工作。

public class HomeController : Controller 
{ 
    [HttpPost] 
    public IActionResult SetLanguage(string culture, string returnUrl) 
    { 
     Response.Cookies.Append(
      CookieRequestCultureProvider.DefaultCookieName, 
      CookieRequestCultureProvider.MakeCookieValue(new RequestCulture(culture)), 
      new CookieOptions { Expires = DateTimeOffset.UtcNow.AddYears(1) } 
     ); 

     return LocalRedirect(returnUrl); 
    } 
} 
+0

控制器...不上课。这是一个愚蠢的错误,非常感谢你! – K7Buoy

0

首先你已经使用CookieRequestCultureProvider的。稍后,您在示例中的操作应该可以正常工作。 我还要补充一点:

CultureInfo.CurrentCulture = culture; 
CultureInfo.CurrentUICulture = culture; 

这里是我的配置:

public void ConfigureServices(IServiceCollection services) 
{ 
    services.AddLocalization(opts => { opts.ResourcesPath = "Resources"; }); 

    services.AddMvc() 
     .AddViewLocalization(
      Microsoft.AspNetCore.Mvc.Razor.LanguageViewLocationExpanderFormat.SubFolder, 
      opts => { opts.ResourcesPath = "Resources"; } 
     ) 
     .AddDataAnnotationsLocalization(); 

    services.Configure<RequestLocalizationOptions>(opts => 
    { 
     var supportedCultures = new[] 
     { 
      new CultureInfo("en-US"), 
      ...    
     }; 
     opts.DefaultRequestCulture = new Microsoft.AspNetCore.Localization.RequestCulture("en-US"); 
     opts.SupportedCultures = supportedCultures; 
     opts.SupportedUICultures = supportedCultures; 
    }); 
} 

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) 
{ 
    app.UseRequestLocalization(); 

    app.UseMvc(routes => 
    { 
     routes.MapRoute(name: "default", template: "{controller=Home}/{action=Index}"); 
    }); 
} 
+1

这不会回答这个问题根本就不存在 – DavidG

+0

这是因为你根本不需要玩Response.Cookies.Append()...... –

+0

你提供的代码如何让用户切换文化p参考? – DavidG